1

次の 2 つの例を検討してください。

class ClassOne
{
 //class definition is here
};

std::vector< ClassOne > myListOfObjects;

std::vector< ClassOne >::const_iterator iter = myListOfObjects.begin();

Example 1: 
for( ; iter < myListOfObjects.end(); **++iter**)
{
   //some operations
}

OR

Example 2: 
for( ; iter < myListOfObjects.end(); **iter++**)
{
   //some operations
}

どちらが速いですか?ループのコンテキストでの ++iter または iter++。

閉鎖の理由:

Brian's Post からコピーしました (質問をより簡潔にするため)。

同様の質問の 1 つを試すこともできます: hereまたはhereまたはhereまたはhere

4

6 に答える 6

8

いいえ、同じパフォーマンスはありません:

  • ポストインクリメントはコピーを作成してからインクリメントし、コピーを返します
  • プリインクリメントはインクリメントしてから元を返します

そのため (int のような単純なものを扱っていない限り)、プリインクリメントの方が高速です。

于 2009-03-10T17:50:52.453 に答える
5

この回答に記載されているように、 pre の方が高速です。これらは、プリミティブ (int、char など) を扱う場合にのみ同じです。この場合、オーバーロードされた演算子を呼び出しています。

于 2009-03-10T17:52:13.200 に答える
3

場合によります。単純なコンパイラでは、プリインクリメントが高速になります。疑似コードでは、それぞれが行うことは次のとおりです。

preincrement() {
  val = val + 1;
  return val;
}

postincrement() {
 tmp = val; // take a temporary copy of the old value
 val = val + 1;
 return tmp;
}

実際には、コンパイラは後置インクリメントを前置インクリメントに変更することがよくあります。ただし、複合型の場合、それができない場合があります。原則として、できる限りプリインクリメントを使用し、その操作の特定のセマンティクスが必要な場合にのみポストインクリメントを使用してください。

于 2009-03-10T17:55:55.577 に答える
2

非プリミティブ型を扱う場合: ++iter は常により効率的です。

++iter がより効率的である理由は、戻り値を取得するためにそれぞれが行う必要がある作業に帰着します。戻り値が実際に使用されるかどうかは問題ではありません。

違い:

  • ++iter は自分自身への参照を返すため、一時的なコピーは必要ありません。(インクリメント、自身の値への参照を返す)

  • iter++ は変数の一時的なコピーを返します (古い値で一時変数を作成し、インクリメントし、一時変数を返します)

    _Myt _Tmp = *this;
    ++*this;
    return (_Tmp);
    

同様の質問の 1 つを試すこともできます: hereまたはhereまたはhereまたはhere。ただし、イテレータには適用されないため、まったく同じではありません。

于 2009-03-10T17:49:32.723 に答える
0

私は、それらがマシンコードで同じものに還元されることをほぼ確信していますが、順序が異なります。それらは同じだと思いますが、簡単なテストアプリを作成して確認することをお勧めします。

于 2009-03-10T17:49:18.870 に答える
0

一般に、ポストインクリメントが特に必要ない場合は、プリインクリメントの方が適しています。

ただし、これはコンパイラ固有のものです。最新のコンパイラのほとんどは、プレフィックス表記の op を少なくします。ただし、クラス メソッドのオーバーロードでは、クラスの実装方法に依存するため、常に最適化されるとは限りません。

于 2009-03-10T17:51:34.917 に答える