私は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;
}
}
なぜこのように行われたのかわかりません。いくつかの最適化のように見えます。しかし、私はこれがマルチコアを簡単に利用できるとは思わない。これはとにかく1つのスレッドにあります。
アイデア?
手動ループのアンローリングのようです。この実装はいつですか? –
一方、 '__trip_count'とゼロを比較する時間が少なく、実際に値を比較する時間が長くなります。 –