迭代器和const_iterator之间的比较是否效率低下?

时间:2012-07-06 13:32:43

标签: c++ performance c++11 iterator const

变体a:

const auto end = whatever.end();
for (auto it = whatever.begin(); it != end; ++it)
{
    // ...
}

变式b:

const auto end = whatever.cend(); // note the call to cend insteand of end here
for (auto it = whatever.begin(); it != end; ++it)
{
    // ...
}

有没有理由相信变量b的效率低于变量a,因为循环条件比较了两种不同的迭代器?这会导致it上的隐式转换吗?

end在for循环中多次使用,因此我希望将其提升。)

1 个答案:

答案 0 :(得分:12)

原则上,效率可能较低,导致非零成本的隐式转换。

实际上,iteratorconst_iterator可能参与继承关系(一个来自另一个,或者两者都来自_iterator_base),因此不等式运算符是在基类上定义,不需要隐式转换(相反,更多派生的迭代器被忽略)。即使没有这些,转换也可能非常简单,无法进行内联和优化。

libstdc ++通过在operator==operator!=之间定义iteratorconst_iterator来优化这些比较:http://gcc.gnu.org/onlinedocs/libstdc++/libstdc++-html-USERS-4.3/a02037.html#l00295

libc ++没有任何优化:http://llvm.org/svn/llvm-project/libcxx/trunk/include/__tree - 尽管来自const_iterator的{​​{1}}的构造函数是如此微不足道,我希望它能够完全优化。