[過去ログ] 物凄い勢いで誰かが質問に答えるスレ@ゲーム製作技術 (1001レス)
前次1-
抽出解除 レス栞

このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
971
(2): 名前は開発中のものです。 [sage] 02/06/28 19:59 ID:??? AAS
>>967
967(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した時点で割り当てられたアドレスの
後方を指してるような気がして不安です。よろしくお願いします。
C++の内部構造はよくわからないが
offsetってのは、その名の通りSingleton<T>クラスのインスタンスのポインタから
Tクラスのインスタンスのポインタへのオフセットだろう。
1って数字は問題じゃない。いくつでもいい、
0で無い事に意味がある。本の受け売りだけどな。
んで、
(T*)((int)this + offset);
は、新たにSingleton<T>クラスのインスタンスが生成されたとして
そのSingleton<T>のインスタンスに属する?Tクラスのインスタンスの位置を
求めてる訳だ。
それをスタティックの箱に入れてやると。
つまりms_Singletonには、最後に生成されたTクラスのインスタンスのポインタが
入ることになる。
・・・と思う。間違ってたら誰かフォローよろしこ。
973
(1): 967 [sage] 02/06/28 21:27 ID:??? AAS
本当に回答どうもありがとうございました
>>969
969(1): 名前は開発中のものです。 [sage] 02/06/28 19:43 ID:??? AAS
>>967
operator newなんかがオーバーライドされてない?
いえ、本の中ではオーバーライドされていませんでした。

>>971
試しに2,3のクラスで使用してみたところ、どうもoffsetの値は
0になるようでした。
説明不足だったので申し訳ありませんがSingletonクラスは
たとえば class CTextureMgr: public ISingleton<CTextureMgr>
のように使うようです。はっきり言って私の頭ではこれだけでもチンプンカンプンですが、
無理やり自分を納得させるため次のように考えてみました。
クラステンプレートはコンパイル時に展開?されるために、本来ならば
ベタに同じことを書いたクラスのサイズと一致しなければならないが、
コンパイラによってはそうならないかもしれない。
そのための保険としてオフセットを求め、それをスタティックな変数(シングルトン)
に代入している。
…思いっきり見当はずれなことを言ってるかもしれませんね
992
(1): 名前は開発中のものです。 [] 02/06/29 00:58 ID:uNPXzVbU(2/3) AAS
>>991
991(1): 名前は開発中のものです。 [sage] 02/06/29 00:41 ID:??? AAS
>>989
多重継承した場合、
アップキャストしたときにベースポインタ(this)がずれるから、
そのoffset値を算出している。
よくわかりました。ありがとうございます。
というか>>971のソースって、新しくTを作る度に
ms_Singletonの中身がころころ変わりますよね。
何個Tをnewしても、得られる実体は1つだけってのが
シングルトンだと思うんでなんか変なような気がする。
前次1-
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.132s*