2

最近、範囲ベースの for を使い始めました (コンパイラ機能を取得した後)。範囲ベースの for を使用するのに適した形式は次のとおりであることに気付きました。

for(const auto& it: container) {...}

これは、int より大きい任意の型で意味があります。ただし、コンテナーが生のポインター (私の場合) を保持している場合、または小さい型を保持している場合はどうなるでしょうか?

具体的には、私が知りたいことは次のとおりです。

1) (おそらく) 小さいコピーの代わりに参照を要求することで、パフォーマンスの低下を招く可能性はありますか? 型のサイズがネイティブ ポインターのサイズと正確に等しい場合はどうなるでしょうか。

2) 逆に、参照を使用しないことでパフォーマンスが低下する可能性はありますか? (範囲ベースの for の場合、コンパイラがいくつかの最適化を実行できる可能性が高いため)

C++ 標準ではなく、考えられるコンパイラの動作についての洞察を求めていることに注意してください。

4

1 に答える 1

2

ループ内で何をするかによって異なります。

「それ」を一度だけ見た場合、コンパイラは最初にアドレスを探してから逆参照して値を取得する必要があるため、違いはありません

「it」を複数回見ると、メモリの一貫性のために違いが生じる可能性があります。「it」でエイリアスされる可能性のあるものに書き込むと、値を何度もリロードする必要があります。

ただし、いつものように、プロファイラーを使用して、実際に存在するパフォーマンスの問題のみを解決してください。

于 2012-12-08T09:40:33.270 に答える