c++ - 为什么 std::find 是这样实现的?

标签 c++ stl std

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

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

有什么想法吗?

最佳答案

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

关于c++ - 为什么 std::find 是这样实现的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14936413/

相关文章:

c++ - 在插入列表之前重复使用相同的字符串似乎是按值传递的?

c++ - [[nodiscard]] 在 std::function 返回类型定义中?

c++ - 如何使用存储在列表中的特定范围的元素初始化 vector ?

c++ - 使用 SendInput 锁定计算机

c++ - 根据字符串大小对字符串 vector 进行排序

c++ - 将 vector 映射到特定范围

c++ - 为什么 constexpr 属性在应用于静态方法时不起作用?

c++ - 是否有任何可能的方法将事件(定制的)附加到在运行时创建的对象?[C++ Builder]

c++ - 使用 std C++ 在 iOS 中读取文本文件

c++ - 按偶数和奇数索引对 vector 进行排序。 C++