Singleton实现之间的区别

时间:2011-01-06 08:24:37

标签: c++ singleton

所以,我找到了不同的方法来实现单身人士的“创造” 编辑:当我说“创造”时,我的意思是。当然,这段代码将放在Singleton :: {ctor}或静态Singleton :: Init()函数中。

//v1
        //the first "1" is casted to a pointer to Ty, then that pointer is casted
        //back to int to obtain the hex address
        //the second 1 is casted to a pointer to Ty, then to a pointer
        //to cSingleton<Ty> because Ty is a derived class and finally
        //back to int to get the hex address
        //after that it's simple pointer arithmetics to get the offset
        int offset = (int)(Ty*)1 - (int)(cSingleton <Ty>*)(Ty*)1;
        m_pSingleton = (Ty*)((int)this + offset);
//v2
        m_pSingleton = static_cast<Ty*>(this);
//v3
        m_pSingleton = (Ty*)this;

他们之间有什么显着差异吗? 据我所知,v2和v3应该是相同的,但它是v1我真的不明白。我知道它的作用,但出于何种目的?

另外,请不要将其变成“Singletons are BAAAAD”讨论。

3 个答案:

答案 0 :(得分:2)

(由于这个问题似乎已经死了,我会尝试自己回答。)
v1做的是手动调整this指针以指向派生对象的地址。通常情况下,static_cast或普通的c风格的演员本身会这样做,但可能在早期的编译器中并非如此,或者存在错误。在这种情况下,它会像演员那样做。

答案 1 :(得分:1)

v2和v3几乎相同,但v3使用的是c风格的转换(c ++样式转换更安全,因为你在编译时得到更多的检查)。

v1是......哇......这就是它正在做的事情:

  • 将数字1投射到我的类型Ty的指针,然后返回int。我希望这仍然会产生1
  • 将数字1转换为我的类型Ty的指针,将其转换为指针cSingleton<Ty>,最后返回int。我希望这仍然是1
  • 减去两个。我希望这是0。
  • 将单例设置为this,与v2和v3类似,但调整为“offset”

我猜测有一些建筑的怪癖,其中投射1的结果会导致非结果,因此偏移量将为非零。因此,这将是一种调整平台上铸造怪癖的方法。

这是一个猜测,我希望有一些评论来解释代码(但可能不会)。也许有人可以使用比我更具体的答案,但希望这会让你有所作为。

答案 2 :(得分:0)

Here是一个不错的单例C ++示例。我不知道你为什么要使用这种编码,这不是一个好习惯。