为什么std::find是这样实现的
Why is std::find implemented this way?
我碰巧遇到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;
}
}
我不知道为什么要这样做。看起来有些优化。但我不认为这会利用多核那么容易。无论如何,这是在一个单独的线程中。
有什么想法吗?
看起来像循环展开,也称为循环展开。
这是循环展开。结果是一样的,但对处理器来说更友好。
渐近复杂度是相同的。
不完全确定,我认为这是一种循环展开。
请参见中的循环展开:http://www.codeproject.com/Articles/6154/Writing-Efficient-C-and-C-Code-Optimization
这是达夫的设备。这是一种古老的优化技术它以一种特殊的方式混合while和switch语句。它使用循环展开。在汇编程序中,您可以直接跳到展开的循环中。
相关文章:
- C++标准是否允许<double>在没有开销的情况下实现 std::可选
- glibcxx STL 在实现 std::valarray::sum() 时是否不正确?
- 在 x86 上实现 std::atomic_thread_fence(std::memory_order_seq_cst
- 尝试实现std::tie和std::tuple的小版本
- 在实现 std::vector 时,我必须拥有 end() 的"end"指针吗?
- 如何正确实现 std::all_of 函数来验证字符串的一部分?
- 如何为向量实现 std::erase ?
- 如何实现std ::何时_any而不进行轮询
- 如何正确安全地实现 std::array 的C++算术运算符
- 与自定义命名空间一起使用时实现 std::error_category、名称解析问题
- 如何为模板类实现std ::哈希
- 为什么标准库不以无锁的方式为 8 字节以下的结构实现 std::atomic?
- 为什么 MSVC 在实现 std::bitset::count 时不使用 __popcnt?
- 实现 std::tuple 的详细信息
- 如何实现std :: set(红色/黑色树)前迭代
- 以C 标准的方式实现STD :: Malloc
- 如何为自定义模板化迭代器实现 std::d istance()
- 如何实现 std::map::查找包含两个结构'Pos'结构的比较逻辑,每个结构包含 x 和 y 坐标
- 实现 std::vector::p ush_back 强异常安全
- 是否可以实现std ::移动和清除功能