C++ワンポイントレッスン Lesson-1 i++ と ++i の違い †前置きと後置きの演算子 †
前置き++と後置き++の違い <レジスタ変数時> †
◆ C++での記述 if (i++ < 10) Hoge(i) ◆ 生成されるアセンブラコード mov ebx, eax inc eax cmp ebx, 10 jnc L1 push eax call Hoge L1: ◆ C++での記述 if (++i < 11) Hoge(i); ◆ 生成されるアセンブラコード inc eax cmp eax, 11 jnc L1 push eax call Hoge L1: 前置き++と後置き++の違い <レジスタ変数時> 結果 †
※実際には、この程度のコードならほとんどのコンパイラは最適化が可能なので、実行時の差異は生じません。 前置き++と後置き++の違い <クラスオブジェクト時> †
◆ C++での記述 (後置き++の場合) CFoo foo; if (foo++ < 10) Hoge(foo) ◆ インライン展開されるコード CFoo tmp = foo; foo.m_value.plus1(); // m_valueをインクリメントする関数 if (CFoo::operator < (tmp.m_value, 10)) { Hoge(foo) }
◆ C++での記述 (前置き++の場合) CFoo foo; if (++foo < 11) Hoge(foo); ◆ インライン展開されるコード if (CFoo::operator < (foo.m_value.plus1() , 11)) { Hoge(foo) }
前置き++と後置き++の違い <クラスオブジェクト時> 実装 †CFooの実装は以下のようになる。 // CFooのインスタンスとなるオブジェクト struct CValue { int hohoho; CValue & plus1() { ++hohoho; } }; bool operator < (const CValue& v, int i) { return v.hohoho < i; } struct CFoo { CValue m_value; // オペレータ++でインクリメントさせたいオブジェクト CFoo() {} bool operator < (int n) { return m_value < n; } CFoo& operator ++() { m_value .plus1(); return *this; } CFoo operator ++(int) { CFoo tmp = *this; //<- オブジェクトの生成とコピーが発生 m_value .plus1(); return tmp; //<- オブジェクトの生成とコピーが発生 } } 前置き++と後置き++の違い <クラスオブジェクト時> 結果 †
前置き++と後置き++のパフォーマンス測定 †STLのvector<int>とmap<int,int>のiteratorをインクリメント(++)する実行時間を、前置きと後置きで比較してみました。
この結果を見ても、意味のない i++ を書きますか? [ 戻る ]
※測定環境 Athlon64 3.0GHz x2 VisualStudio 2009 |