shared_resource

06/10/06

概要

リソースの無駄ない管理を実現する。
例えば、

// 異なる画像を読み込む例
shared_resource<T> t1, t2;
t1.Load("a.bmp");
t2.Load("b.bmp");

とすればa.bmpとb.bmpを読み込んで二つのオブジェクトが内部的に生成されるが、

// 同じ画像を読み込む例
shared_resource<T> t1, t2;
t1.Load("a.bmp");
t2.Load("a.bmp");

とすれば同じa.bmpなので最初に生成されたオブジェクトを使いまわしてメモリ消費と読み込み時間を節約する。
当然ながら、使うリソースが少なければ効率は悪くなる。
また、参照カウント方式を取っているため、一瞬でも参照カウントが0になれば直ちにオブジェクトが破棄され、その後すぐに同じ画像を使うとき読み直す必要が生じる。
この点は改善すべき課題ではある。

// 不必要なオブジェクト破棄と再生成が行われる例
shared_resource<T> t1, t2;
t1.Load("a.bmp");
t1.Close();
t2.Load("a.bmp");

使用方法

#typedef shared_resoururce<T> shared_T
map<string, shared_T::sharedobject> shared_T::m_List;
のようにして使う(staticメンバがあるため少し面倒)。

メンバ関数

static map<string,sharedobject>::iterator begin()

読み込まれているリソースのマップの最初の要素のイテレータを返す。
通常使うことはない。

void Close()

使用を中止する。
明示的に呼び出す必要がある場面は少ない。

static map<string,sharedobject>::iterator end()

読み込まれているリソースのマップの最後の次の要素のイテレータを返す。

T* GetT()

オブジェクトの実体へのポインタを返す。

void Open(const string& filename)

指定されたファイル名を持つリソースを使用可能にする。
必要ならば読み込みを行う。

shared_resource(const string& filename)

コンストラクタ。
shared_resourceオブジェクト生成と同時に読み込みを行う。
コードを簡潔に記述できるが内容的に特別なことはやっていない。