同様の質問が、あまり具体的な: Performance issue for vector::size() in a loopパフォーマンス++メンバ関数内のループの内側のサイズ()
我々のようなメンバ関数にしていると仮定します。
void Object::DoStuff() {
for(int k = 0; k < (int)this->m_Array.size(); k++)
{
this->SomeNotConstFunction();
this->ConstFunction();
double x = SomeExternalFunction(i);
}
}
1)私は、 "SomeExternalFunction"だけがコンパイラによって最適化され、m_Arrayのsize()を重複して呼び出さない場合、それが信じられると思います。
2)あなたはほぼ確実にあなたがCONSTされていないいくつかのメンバ関数を呼び出している場合
int N = m_Array.size()
for(int k = 0; k < N; k++) { ... }
をやってから速度の弾みがつくと思いませんか?
編集ない多分私は明確にすることができ、これらのダウン票とマイクロ最適化について悪意に満ちたコメントがどこから来ていることを確認:
まず、それはそれ自体は最適化することではないですが、まさにコンパイラが意志を理解します修正されません。通常はsize()関数を使用しますが、ここでは配列には何百万ものデータポイントが含まれている可能性があるため質問します。
第2に、「SomeNotConstFunction」が配列のサイズを変更する可能性が非常に低いか、またはその能力がトグルされる他の変数に依存する可能性があるという状況です。だから、私はコンパイラがどの時点でコンパイルに失敗するかを尋ねています。実際に配列がの場合はsize()によって発生する時間コストは正確には人間が知ることはできないが、の変更になります。
第三に、ループ内の操作が非常に簡単です、そこにそれらのほんの何百万人はいるが、彼らはあきれるほど平行です。私は値を外部に置くことによって、コンパイラがいくつかの作業をベクトル化できるようにすることを願っています。
C++ 11でO(1)で実行するために 'std :: list'が必要であるという' size() 'を追加したいと思います。 –