变体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循环中多次使用,因此我希望将其提升。)
答案 0 :(得分:12)
原则上,效率可能较低,导致非零成本的隐式转换。
实际上,iterator
和const_iterator
可能参与继承关系(一个来自另一个,或者两者都来自_iterator_base
),因此不等式运算符是在基类上定义,不需要隐式转换(相反,更多派生的迭代器被忽略)。即使没有这些,转换也可能非常简单,无法进行内联和优化。
libstdc ++通过在operator==
和operator!=
之间定义iterator
和const_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}}的构造函数是如此微不足道,我希望它能够完全优化。