2016-12-03 11 views
4

私はその後、私が持っている、インデックスでベクトルを反復処理したい:コンパイラは "for"文で2番目の条件を最適化しますか?

for(size_t i=0;i<v.size();++i) 
{...} 

私が知って訪問するイテレータを使用して、より効果的ですが、私はちょうど、コンパイラの最適化についての技術的な観点で議論したいです。

私の質問は一度だけ、または複数回、この「v.size()」を実行しないのですか?

size_t s=v.size() 
for(size_t i=0;i<s;++i) 
:私はしていないように - コンパイラはサイズが一度十分に計算する必要がある、または任意の最適化戦略により、複数回呼び出される必要があるかどうかを決定するために私を助ける

あるいは、

コードをより効率的にするには?

+3

保証はありません。この標準では、コンパイラーはこれを行う必要はなく、そうすることも禁止していません。したがって、それはあなたのコンパイラに完全に依存します。分解を確認して確認する必要があります。または、それが正しいことを単に信じる。 –

+0

私の経験は毎回実行されることです。 –

+0

一般に、オプティマイザが何をするのかを見たい場合は、[godbolt](http://gcc.godbolt.org)にアクセスし、コードを入力します。 – PaulMcKenzie

答えて

4

私の質問は、この "v.size()"は1回または複数回実行されますか?

ループ本体の実行が終了するたびに、繰り返し実行されるかどうかを確認するために複数回実行されます。

コンパイラは、またはそれだけでコンパイラに依存し、size()を複数回呼び出すことなく、コードを最適化しない場合があります。

コンパイラはあなたがループ内でvを変更していないことを保証することができる場合、[はい、コンパイラがそれを最適化することが完全に可能です。それができないなら、それはおそらく(それがない場合、コンパイラが悪い)とはコンパイラとして、それを最適化することはできませんではないでしょう、あなたが書いたもの、その後完全に異なる何かをするコードを生成します。

また、コンパイラはそれを離れて最適化していない場合でも、あなたは多分、本当に何もないこれ、1つのまたは2のCPUサイクルを節約できます。 size()O(1)である場合は、ベクトルからメンバ変数を返す以外に何もしないでください。途中で最適化しないでください。

関連する問題