今回やること
- コードをポインタで管理
- smart_pointerの導入
コードのポインタ管理
現状のプログラムではコード(Code)オブジェクトの生成と解放を実行中に多数行っています. メモリの生成と解放にはコスト(=実行時間)がかかるので、ポインタで管理することで、その回数を削減しました. 本題ではないので省略. コード差分
$ valgrind --leak-check=full ./bin/mastermind 3 3 --test
でメモリリークのテスト済み
smart pointerの導入
モダンなポインタ管理方法 ( 参考: C++11スマートポインタ入門 - Qiita )
スマートポインタには
- unique_ptr
- shared_ptr
- week_ptr
の3種類ありますが, Codeは複数のコンテナで共有されて管理されるのでshared_ptrを選択
using ColorType = short; using HintType = short; using Code = std::vector<ColorType>; using CodePtr = std::shared_ptr<Code>; // 変更!! using HitBlow = std::pair<HintType, HintType>; using CodeList = std::deque<Code>; using CodePtrList = std::deque<CodePtr>;
生成するときは std::make_shared
を使用.
CodePtr code = std::make_shared<Code>(Code(code)); CodePtr code{shared_ptr<Code>(Code(code))}; // 直接生成する場合 auto code = std::make_shared<Code>(Code(code)); // 書籍 "Optimized C++" で推奨されているのはこの書き方
shared_ptrに関しては
delete pointer
deleteする必要ありません( むしろ, しているとコンパイルエラー ).
実験
10回の実行時間の平均で比較します.
nColors | nPins | totalTime [msec] | pointer - totalTime [msec] |
---|---|---|---|
5 | 5 | 0.8 | 3.7 |
6 | 5 | 1123.4 | 679.7 |
7 | 5 | 27990.2 | 18467.3 |
大きいサイズだと差が出ていますね. ( これはsmart pointerに変えたからではなく, コード管理コンテナをCode型を直接管理するのから CodePtrを管理するように変更したのが直接的な要因です )
まとめ
Codeオブジェクトをポインタで管理することで, メモリ生成の回数を削減しました. またスマートポインタを導入することでメモリ管理を安全にしています.
コード
参考
他の記事
- 次の記事
- 前の記事
- 一覧 mastermind カテゴリーの記事一覧 - サブロウ丸