【问题标题】:Why is std::find implemented this way?为什么 std::find 以这种方式实现?
【发布时间】:2013-02-18 12:33:27
【问题描述】:

我碰巧遇到了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;
}
}

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

有什么想法吗?

【问题讨论】:

  • 看起来像手动循环展开。这个实现是从哪里来的?
  • 一方面,将__trip_count 与零进行比较所花费的时间更少,而实际比较值所花费的时间更多。

标签: c++ stl std


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    但渐近复杂度是一样的。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 这不是 Duff 的设备,switch 语句不在循环内。不过,如果确实使用 Duff 的设备,发出的代码很可能会更小。
        • @SteveJessop:我的印象是你把 duff 的设备放在展开循环的末尾而不是里面。只有最后一次迭代才会有非完整计数。
        • @LokiAstari:不,这不正确。 Duff 的发明特别是(ab)使用 C 开关结构来跳转到展开循环的中间,其中“中间”是“所需的迭代次数以展开长度为模”。所以实际上这是第一次没有完整计数的迭代。
        猜你喜欢
        • 2023-04-01
        • 2018-11-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多