我碰巧遇到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;
}
}
我不知道为什么这样做。看起来像一些优化。但我不认为这会利用多核这么容易。无论如何,这是一个单一的线程。
有什么想法吗?
答案 0 :(得分:7)
看起来像loop unwinding,也称为循环展开。
答案 1 :(得分:4)
循环展开。结果是一样的,但它对处理器来说更友好。
虽然渐近复杂度是相同的。
答案 2 :(得分:1)
不完全确定,我认为这是一种循环展开。
请参阅循环展开:http://www.codeproject.com/Articles/6154/Writing-Efficient-C-and-C-Code-Optimization
答案 3 :(得分:-2)
这是Duff's device。这是一项古老的优化技术 混合while和以特殊方式切换语句。它使用循环展开。在汇编程序中,您将在展开的循环中跳转。