Tôi tình cờ chạy vào nguồn của std::find
và thấy nó gây nhầm lẫn cho tôi. Về cơ bản, nó chia số lượng mục cho 4 và thực hiện so sánh 4 trong mỗi vòng:Tại sao std :: find thực hiện theo cách này?
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;
}
}
Tôi không biết tại sao nó lại được thực hiện theo cách này. Hình như một số tối ưu hóa. Nhưng tôi không nghĩ rằng điều này sẽ tận dụng lợi thế của đa lõi dễ dàng. Đây là một chủ đề duy nhất anyway.
Bất kỳ ý tưởng nào?
Dường như bỏ vòng lặp thủ công. Whence là việc thực hiện này? –
Đối với một điều, nó dành ít thời gian so sánh '__trip_count' với 0 và nhiều thời gian hơn so sánh giá trị. –