11

变体一:

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 循环中多次使用,因此我希望将其吊出。)

4

1 回答 1

12

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

在实践中,iterator并且const_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_iteratorfrom的构造函数再次iterator如此微不足道,我希望它被完全优化出来.

于 2012-07-06T13:40:01.887 回答