[過去ログ] 物凄い勢いで誰かが質問に答えるスレ@ゲーム製作技術 (1001レス)
上下前次1-新
抽出解除 レス栞
このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
このスレッドは過去ログ倉庫に格納されているため、キャッシュを表示しています。過去ログメニュー
969(1): 名前は開発中のものです。 [sage] 02/06/28 19:43 ID:??? AAS
>>967967(3): 名前は開発中のものです。 [age] 02/06/28 13:40 ID:??? AAS
GameProgrammingGemsのセクション1.3 自動シングルトンユーティリティ
で、下のコードがなにをやってるのかわかりません。誰か説明してくれませんか?
template<typename T> class Singleton
{
static T* ms_Singleton;
public:
Singleton()
{
int offset = (int)(T*)1 - (int)(Singleton<T>*)(T*)1;
ms_Singleton = (T*)((int)this + offset);
}
...
}:
クラステンプレート自体のサイズとTのサイズを足したものをシングルトンに
割り当ててるのかな?と思いますが、newした時点で割り当てられたアドレスの
後方を指してるような気がして不安です。よろしくお願いします。
operator newなんかがオーバーライドされてない?
973(1): 967 [sage] 02/06/28 21:27 ID:??? AAS
本当に回答どうもありがとうございました
>>969
いえ、本の中ではオーバーライドされていませんでした。
>>971971(2): 名前は開発中のものです。 [sage] 02/06/28 19:59 ID:??? AAS
>>967
C++の内部構造はよくわからないが
offsetってのは、その名の通りSingleton<T>クラスのインスタンスのポインタから
Tクラスのインスタンスのポインタへのオフセットだろう。
1って数字は問題じゃない。いくつでもいい、
0で無い事に意味がある。本の受け売りだけどな。
んで、
(T*)((int)this + offset);
は、新たにSingleton<T>クラスのインスタンスが生成されたとして
そのSingleton<T>のインスタンスに属する?Tクラスのインスタンスの位置を
求めてる訳だ。
それをスタティックの箱に入れてやると。
つまりms_Singletonには、最後に生成されたTクラスのインスタンスのポインタが
入ることになる。
・・・と思う。間違ってたら誰かフォローよろしこ。
試しに2,3のクラスで使用してみたところ、どうもoffsetの値は
0になるようでした。
説明不足だったので申し訳ありませんがSingletonクラスは
たとえば class CTextureMgr: public ISingleton<CTextureMgr>
のように使うようです。はっきり言って私の頭ではこれだけでもチンプンカンプンですが、
無理やり自分を納得させるため次のように考えてみました。
クラステンプレートはコンパイル時に展開?されるために、本来ならば
ベタに同じことを書いたクラスのサイズと一致しなければならないが、
コンパイラによってはそうならないかもしれない。
そのための保険としてオフセットを求め、それをスタティックな変数(シングルトン)
に代入している。
…思いっきり見当はずれなことを言ってるかもしれませんね
上下前次1-新書関写板覧索設栞歴
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 6.253s