在分析应用程序时,我遇到了与gcc 4.7.1一起提供的标准库实现部分。它是include/g++-v4/bits/vector.tcc
template<typename _Tp, typename _Alloc>
template<typename _ForwardIterator>
void
vector<_Tp, _Alloc>::
_M_range_insert(iterator __position, _ForwardIterator __first,
_ForwardIterator __last, std::forward_iterator_tag)
{
…
}我注意到函数签名的最后一个参数只是一个标记,我开始想知道它为什么会出现在这里。快速浏览一下this page就会发现std::forward_iterator_tag是一个空结构。它在这里的作用是什么?显然,它对函数是无用的,它可能会浪费一个寄存器或堆栈上的一些空间。那为什么呢?
发布于 2013-07-02 18:23:00
它是模板元编程机制的一部分,它用于根据参数的特征选择适当的重载,例如,如果你有随机访问迭代器,你可以利用它来检查它们之间的距离,并在插入之前保留。另一方面,如果你只有正向迭代器,检查距离将是O(n),所以你不这样做,只需向后推,这可能会导致多次重新定位,因此速度会更慢。此外,编译器会优化出这些空结构,因此没有运行时损失。
https://stackoverflow.com/questions/17422915
复制相似问题