ゲーププログラミングの開発環境が変化してきました。 アセンブラ C C++ C# Java JavaScript
メインはC++ コーディングの容易さではC#やJava C++11で大幅な機能アップ
ゲームプログラミングにC++11のフィーチャーを取り入れることで効率アップ
コーディングの効率化 バグの出にくい構造 パフォーマンスアップ
Chap.1 moveの活用 1-1 右辺値参照のおさらい 1-2 moveコンストラクタとmove operator = を実装 1-3 std::swapの違い 1-4 VisualStudioはmoveコンストラクタを自動生成してくれない 1-5 落とし穴 1-5-1 move後のクラスオブジェクトへのアクセス 1-5-2 継承クラスのmoveコンストラクタ Chap.2 ラムダ式の活用 2-1 コールバックの活用 2-1 キャプチャの注意点 Chap.3 コピーコンストラクタの廃止 3-1 コピーコンストラクタをmoveコンストラクタに置き換える 3-2 shared_ptrをunique_ptrに置き換える Chap.4 応用編 描画ループの処理 4-1 1/60秒の間隔で呼ばれるメインループ 4-2 Threadもco-routineも使わないマルチタスク的処理 4-3 タスクマネージャの紹介
*/
string a = "1"; string b = "2"; string c = a + b; /* 右辺値とは、名前のない一時的に生成されるオブジェクト この場合、string型で値が"12"の一時オブジェクトが生成される。 わかりやすく置き換えると、
string a = "1"; string b = "2"; string tmp = a; /// copy tmp += b; // resize and copy string c = tmp; // copy
このような動作になる。 tmpはfuncを呼び出した後は不要になる、一時オブジェクトだ。 さて、最後の"c = tmp"で行われるコピーが無駄な動作ということは明白だ。 tmpをcにエイリアスしてしまえはば、解決する。ところが、
string& c= a + b;
これはエラーになる。"a + b"は右辺値なので、参照として使うことができない。 そこで、右辺値参照という新しい機能が追加された。
string&& c = a + b;
これで、内部的にはc++03で記述すると以下の動作とほぼ等しくなる string tmp = a; tmp += b; string& c = tmp;
では、moveはどこでつかうかというと、 string&& c = a + b; とするかわりに、 string c = move(a+b); とすることで、a+bの一時オブジェクトをcに移動することになる。 cは左辺値なので、なんの制約もなく使うことができる。
moveのコストは、一般的にcopyよりも少ない。stringならば、バッファのポインタとサイズを記憶している変数をコピーするだけだ。
なお、上記の例はわかりやすくするために move(a+b)と書いたが、a+bは明らかに右辺値なので、moveは省略可能だ。 moveは、左辺値を右辺値に変換するときに使う。
string a = "1"; string c = move(a); // cにaのインスタンスが移動する。
1-2 moveコンストラクタとmove operator = を実装