6

我碰巧遇到了它的来源,std::find发现它让我感到困惑。基本上它将项目数除以 4 并在每一轮中进行比较 4:

template<typename _RandomAccessIterator, typename _Tp>
_RandomAccessIterator
__find(_RandomAccessIterator __first, _RandomAccessIterator __last,
   const _Tp& __val, random_access_iterator_tag)
{
  typename iterator_traits<_RandomAccessIterator>::difference_type
__trip_count = (__last - __first) >> 2;

  for (; __trip_count > 0; --__trip_count)
{
  if (*__first == __val)
    return __first;
  ++__first;

  if (*__first == __val)
    return __first;
  ++__first;

  if (*__first == __val)
    return __first;
  ++__first;

  if (*__first == __val)
    return __first;
  ++__first;
}

  switch (__last - __first)
{
case 3:
  if (*__first == __val)
    return __first;
  ++__first;
case 2:
  if (*__first == __val)
    return __first;
  ++__first;
case 1:
  if (*__first == __val)
    return __first;
  ++__first;
case 0:
default:
  return __last;
}
}

我不知道为什么会这样。看起来像一些优化。但我认为这不会那么容易地利用多核。无论如何,这是在一个线程中。

有任何想法吗?

4

4 回答 4

7

看起来像循环展开,也称为循环展开。

于 2013-02-18T12:36:06.717 回答
4

这是循环展开。结果是一样的,但对处理器更友好。

渐近复杂度是相同的。

于 2013-02-18T12:36:15.903 回答
1

不完全确定,我认为这是一种循环展开。

请参阅循环展开: http: //www.codeproject.com/Articles/6154/Writing-Efficient-C-and-C-Code-Optimization

于 2013-02-18T12:38:23.940 回答
-2

这是达夫的设备。这是一种古老的优化技术,它以一种特殊的方式混合了 while 和 switch 语句。它使用循环展开。在汇编程序中,您将直接跳入展开的循环中。

于 2013-02-18T12:38:22.260 回答