Я случайно столкнулся с источником std::find
и считаю это сбивающим с толку. В основном он делит количество элементов на 4 и сделайте сравнение 4 в каждом раунде:Почему std :: find реализован таким образом?
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» с нолем и больше времени, фактически сравнивая значения. –