[[FrontPage]]

  ゲーププログラミングの開発環境が変化してきました。
  アセンブラ
  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 タスクマネージャの紹介

 */
// CHAPTER-1 moveの活用
//
// moveのおさらい
// 右辺値参照?

string a = "1";
string b = "2";
string c = a + b;
//         ~~~~~
//         右辺値
/*
右辺値とは、名前のない一時的に生成されるオブジェクト
この場合、string型で値が"12"の一時オブジェクトが生成される。
わかりやすく置き換えると、
*/ [#o8ebca5e]
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のインスタンスが移動する。
// これ以降はaにアクセスしてはならない。



1-2 moveコンストラクタとmove operator = を実装


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS