Google C++ Style Guideによると、「戻り値が無視される場合、'pre' フォーム ( ++i
) は 'post' フォーム ( i++
) よりも効率が劣ることはなく、多くの場合より効率的です。」
ガイドはその理由を説明し続けますが、正確にはわかりません。考え?おそらく誰かがこの概念の例を提供できますか?
Google C++ Style Guideによると、「戻り値が無視される場合、'pre' フォーム ( ++i
) は 'post' フォーム ( i++
) よりも効率が劣ることはなく、多くの場合より効率的です。」
ガイドはその理由を説明し続けますが、正確にはわかりません。考え?おそらく誰かがこの概念の例を提供できますか?
i++
i
の初期値をインクリメントして返しますi
。つまり:
int i = 1;
i++; // == 1 but i == 2
ただし++i
、実際の増分値を返します。
int i = 1;
++i; // == 2 and i == 2 too, so no need for a temporary variable
最初のケースでは、コンパイラは一時変数を作成する必要があります (使用されている場合) (それがもちろん定数ではなく動的な値である場合、たとえば呼び出しからの戻り値の場合) 1
。2
2 番目のケースでは、そうする必要はありません。したがって、2 番目のケースは、少なくとも同じくらい効果的であることが保証されています。
多くの場合、コンパイラは最初のケースを 2 番目のケースに最適化できますが、できない場合もあります。
とにかく、私たちは非常に無視できる影響について話している.
しかし、 のようなオブジェクトなどのより複雑iterators
なオブジェクトでは、何百万回も反復すると、一時的な状態を持つのがかなり遅くなる可能性があります。
経験則
特に後置セマンティクスが必要でない限り、前置バージョンを使用してください。
引用元:
http://www.parashift.com/c++-faq/increment-pre-post-speed.html
++i は、i++ よりも高速である場合もありますが、低速になることはありません。
int のような組み込み型の場合は問題ありません。++i と i++ は同じ速度です。イテレータのようなクラス型の場合、i++ は this オブジェクトのコピーを作成する可能性があるため、++i は i++ よりもはるかに高速である可能性があります。
i++ のオーバーヘッドがあったとしても、アプリが CPU バウンドでない限り、実質的な違いはないでしょう。たとえば、アプリがほとんどの時間を誰かがマウスをクリックするのを待ったり、ディスク I/O、ネットワーク I/O、またはデータベース クエリを実行したりすることに費やしている場合、CPU サイクルを少し浪費してもパフォーマンスが低下することはありません。ただし、++i を入力するのは i++ と同じくらい簡単なので、i の古い値が実際に必要でない限り、前者を使用しないでください。
したがって、i++ をより大きな式の一部としてではなく、ステートメントとして記述している場合は、代わりに ++i を記述してみませんか? 何も失うことはなく、時には何かを得ることもあります。古いライン C プログラマーは、++i の代わりに i++ を書くことに慣れています。例えば、彼らは言うでしょう、
for (i = 0; i < 10; i++) ....
これは i++ をより大きな式の一部としてではなくステートメントとして使用するため、代わりに ++i を使用することをお勧めします。対称性については、組み込み型や、void を返す後置演算子を持つクラス型など、速度が向上しない場合でも、個人的にはそのスタイルを推奨します。
i++ - i が使用された後に値がインクリメントされます ++i - 値がすぐにインクリメントされます。
++i は i をただちにインクリメントするよう要求するため、パフォーマンスに違いがある可能性があります。i++ は、インクリメントされる前に i が必要になる可能性があることを示唆しています。その値は、インクリメントされる前にどこかに保存される場合があります。
インクリメント (またはデクリメント) 演算子には、インクリメントと、式の結果として 2 つの値 (古いまたは新しい) のいずれかを取るという 2 つの操作が含まれます。違いは、どちらを取るかです。
プリフォームを取得する場合は、最初にインクリメントしてから、新しい値である値を取得します。
ポストフォームについて語るとき、古い値を取得して保持し、インクリメントし、新しい値を古い位置に置き、古い値を返します。これはもっと複雑に聞こえますが、実際はそうです。
しかし、式の戻り値が無視された場合、組み込み型であろうとオブジェクトであろうと、まったく違いはありません。
イテレータやその他のテンプレート タイプの場合は、プレインクリメントを使用します。