为什么std :: find以这种方式实现?

elt*_*sky 5 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;
}
}
Run Code Online (Sandbox Code Playgroud)

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

有任何想法吗?

Som*_*ude 7

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