ssacontents/c++lesson-chap1
をテンプレートにして作成
Check
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
開始行:
*C++ワンポイントレッスン Lesson-1 i++ と ++i の違い [#ma...
**前置きと後置きの演算子 [#sbc8cbac]
-C++には、C言語と同様の変数をインクリメント・デクリメント...
-C言語の時は、おもに整数,ポインタ変数などに対し、アセンブ...
-C++では、オブジェクトの演算子をユーザーが定義できるよう...
**前置き++と後置き++の違い <レジスタ変数時> [#h5bea3...
-C言語の時と同様に、レジスタ変数における前置きと後置きの...
''◆ 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:
***前置き++と後置き++の違い <レジスタ変数時> 結果 [...
-前置き++の場合のデメリット
--命令が1つされる。(メモリの増加、速度の低下)
--レジスタ変数が1つ消費される。(最適化の効率低下)
--コンパイル時間の増加。(最適化の余地が多いため、最適化...
※実際には、この程度のコードならほとんどのコンパイラは最適...
※生成されるアセンブラはイメージです。実際にはコンパイラに...
**前置き++と後置き++の違い <クラスオブジェクト時> [#...
-クラスオブジェクトでオーバーライドされた演算子における前...
''◆ 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)
}
-- foo++は、if文の成否にかかわらず実行されなければならな...
-- if文の比較(< 10)は、foo++を実行する前の状態をif文で比...
-- コンパイラは、まずfooの状態を記憶し、++fooを実行してか...
''◆ C++での記述 (前置き++の場合)''
CFoo foo;
if (++foo < 11) Hoge(foo);
''◆ インライン展開されるコード''
if (CFoo::operator < (foo.m_value.plus1() , 11))
{
Hoge(foo)
}
-- if文の実行は、++fooの後の値を参照するため、プログラム...
-- 不要なオブジェクトの生成とコピーが無いため、高速でコー...
***前置き++と後置き++の違い <クラスオブジェクト時> ...
CFooの実装は以下のようになる。
// CFooのインスタンスとなるオブジェクト
struct CValue {
int hohoho;
CValue & plus1() { ++hohoho; }
};
bool operator < (const CValue& v, int i) { return v.hoho...
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; //<- オブジェクトの生成とコピー...
}
}
***前置き++と後置き++の違い <クラスオブジェクト時> ...
-前置き++時のデメリット
--CFooのオブジェクトの生成の追加
--CFooオブジェクトの代入(コピー)の追加(インライン展開...
--コード量の増加
--最適化コストの増加
**前置き++と後置き++のパフォーマンス測定 [#q5ce78b8]
STLのvector<int>とmap<int,int>のiteratorをインクリメント(...
|オブジェクト|map<> iterator++|map<> ++iterator|vector<> ...
|実行時間(Releaseビルド)|1.300815|0.300459|0.567246|0.566...
|比率|100.00%|23.10%|100.00%|99.98%|
|実行時間(Debugビルド)|1.361722|0.108110|1.203101|0.157290|
|比率|100.0%|7.94%|100.00%|13.07%|
- vector<int>::iteratorの場合は、int*としてコンパイルされ...
- 最適化が行われないデバッグビルドにおいては、map<int,int...
- つまり、最適化が効きにくい複雑なプログラムほど、後置+...
&size(15){''この結果を見ても、意味のない i++ を書きますか...
#back
※測定環境 Athlon64 3.0GHz x2 VisualStudio 2009
[[ssacontents]]
終了行:
*C++ワンポイントレッスン Lesson-1 i++ と ++i の違い [#ma...
**前置きと後置きの演算子 [#sbc8cbac]
-C++には、C言語と同様の変数をインクリメント・デクリメント...
-C言語の時は、おもに整数,ポインタ変数などに対し、アセンブ...
-C++では、オブジェクトの演算子をユーザーが定義できるよう...
**前置き++と後置き++の違い <レジスタ変数時> [#h5bea3...
-C言語の時と同様に、レジスタ変数における前置きと後置きの...
''◆ 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:
***前置き++と後置き++の違い <レジスタ変数時> 結果 [...
-前置き++の場合のデメリット
--命令が1つされる。(メモリの増加、速度の低下)
--レジスタ変数が1つ消費される。(最適化の効率低下)
--コンパイル時間の増加。(最適化の余地が多いため、最適化...
※実際には、この程度のコードならほとんどのコンパイラは最適...
※生成されるアセンブラはイメージです。実際にはコンパイラに...
**前置き++と後置き++の違い <クラスオブジェクト時> [#...
-クラスオブジェクトでオーバーライドされた演算子における前...
''◆ 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)
}
-- foo++は、if文の成否にかかわらず実行されなければならな...
-- if文の比較(< 10)は、foo++を実行する前の状態をif文で比...
-- コンパイラは、まずfooの状態を記憶し、++fooを実行してか...
''◆ C++での記述 (前置き++の場合)''
CFoo foo;
if (++foo < 11) Hoge(foo);
''◆ インライン展開されるコード''
if (CFoo::operator < (foo.m_value.plus1() , 11))
{
Hoge(foo)
}
-- if文の実行は、++fooの後の値を参照するため、プログラム...
-- 不要なオブジェクトの生成とコピーが無いため、高速でコー...
***前置き++と後置き++の違い <クラスオブジェクト時> ...
CFooの実装は以下のようになる。
// CFooのインスタンスとなるオブジェクト
struct CValue {
int hohoho;
CValue & plus1() { ++hohoho; }
};
bool operator < (const CValue& v, int i) { return v.hoho...
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; //<- オブジェクトの生成とコピー...
}
}
***前置き++と後置き++の違い <クラスオブジェクト時> ...
-前置き++時のデメリット
--CFooのオブジェクトの生成の追加
--CFooオブジェクトの代入(コピー)の追加(インライン展開...
--コード量の増加
--最適化コストの増加
**前置き++と後置き++のパフォーマンス測定 [#q5ce78b8]
STLのvector<int>とmap<int,int>のiteratorをインクリメント(...
|オブジェクト|map<> iterator++|map<> ++iterator|vector<> ...
|実行時間(Releaseビルド)|1.300815|0.300459|0.567246|0.566...
|比率|100.00%|23.10%|100.00%|99.98%|
|実行時間(Debugビルド)|1.361722|0.108110|1.203101|0.157290|
|比率|100.0%|7.94%|100.00%|13.07%|
- vector<int>::iteratorの場合は、int*としてコンパイルされ...
- 最適化が行われないデバッグビルドにおいては、map<int,int...
- つまり、最適化が効きにくい複雑なプログラムほど、後置+...
&size(15){''この結果を見ても、意味のない i++ を書きますか...
#back
※測定環境 Athlon64 3.0GHz x2 VisualStudio 2009
[[ssacontents]]
ページ名: