サブロウ丸

主にプログラミングと数学

master mind by c++; part10 smart pointer

今回やること

  • コードをポインタで管理
  • 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オブジェクトをポインタで管理することで, メモリ生成の回数を削減しました. またスマートポインタを導入することでメモリ管理を安全にしています.

コード

参考

他の記事