11

バリアント 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)
{
    // ...
}

ループ条件が 2 つの異なる種類の反復子を比較するため、バリアント b がバリアント a よりも効率的でないと信じる理由はありますか? これは で暗黙の変換を引き起こしますitか?

endfor ループ内で複数回使用されるため、それを巻き上げたいと思います。)

4

1 に答える 1

12

原則として、効率が低下し、ゼロ以外のコストで暗黙的な変換が行われる可能性があります。

実際には、iteratorandconst_iteratorは継承関係 (一方が他方から派生するか、両方が から派生する_iterator_base) に参加する可能性が高く、不等式演算子が基底クラスで定義され、暗黙的な変換が不要になるようにします (代わりに、より派生したイテレータは無視されます)。これらがなくても、変換はインライン化して最適化するのに十分なほど単純なものになる可能性があります。

libstdcoperator== ++ は、とのoperator!=iteratorで とを定義することにより、これらの比較を異なる方法で最適化します。const_iterator

libc++ には最適化がありません: http://llvm.org/svn/llvm-project/libcxx/trunk/include/__treeconst_iterator - ここでもfromのコンストラクターiteratorは非常に簡単なので、完全に最適化されると期待しています.

于 2012-07-06T13:40:01.887 に答える