游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2383|回复: 4

关于Ogre3D里的Singleton的问题

[复制链接]

4

主题

18

帖子

18

积分

新手上路

Rank: 1

积分
18
发表于 2009-10-17 10:01:00 | 显示全部楼层 |阅读模式
namespace Ogre {

    /** Template class for creating single-instance global classes.
    */
    template <typename T> class Singleton
    {
    protected:

        static T* ms_Singleton;

    public:
        Singleton( void )
        {
            assert( !ms_Singleton );
#if defined( _MSC_VER ) && _MSC_VER < 1200         
@mark:            int offset = (int)(T*)1 - (int)(Singleton <T>*)(T*)1;
@mark:            ms_Singleton = (T*)((int)this + offset);
#else
            ms_Singleton = static_cast< T* >( this );
#endif
        }
        ~Singleton( void )
            {  assert( ms_Singleton );  ms_Singleton = 0;  }
        static T& getSingleton( void )
                {        assert( ms_Singleton );  return ( *ms_Singleton ); }
        static T* getSingletonPtr( void )
                { return ms_Singleton; }
    };
}
@mark的两行为什么这样?为什么是1?

86

主题

2251

帖子

2386

积分

金牌会员

Rank: 6Rank: 6

积分
2386
QQ
发表于 2009-10-17 12:58:00 | 显示全部楼层

Re:关于Ogre3D里的Singleton的问题

某些指针的类型转换,会造成指针值的变动。因此需要计算得出相对偏移,再用偏移换算出正确的地址值。
关于偏移,参考这篇文章的部分段落:http://dustin.javaeye.com/blog/362416

1只是起到一个起点的作用,就像你和人比个子,要站在一个水平上。这个水平无论海拔多少,都不影响你比较。

86

主题

2251

帖子

2386

积分

金牌会员

Rank: 6Rank: 6

积分
2386
QQ
发表于 2009-10-17 13:07:00 | 显示全部楼层

Re:关于Ogre3D里的Singleton的问题

因为这个单件的用户类(即继承class Orge::Singleton的类),可以同时继承别的类。这样就是多重继承,指针的类型转换时会有地址值的变化,参见前帖的链接。

在class Orge::Singleton的构造函数中,会把this值给ms_Singleton,提供给getSingleton和getSingletonPtr。但是这个this有可能不是单件用户类的对象的地址,它们之间可能存在一定的偏移(原因还是看参考贴吧)。_MSC_VER < 1200的MSVC编译器不支持static_cast,而static_cast能自动把这偏移加上。没有static_cast的情况下,你只好自己算得偏移,再加给this值,赋到ms_Singleton上。

4

主题

18

帖子

18

积分

新手上路

Rank: 1

积分
18
 楼主| 发表于 2009-10-17 17:19:00 | 显示全部楼层

Re: Re:关于Ogre3D里的Singleton的问题

funcman: Re:关于Ogre3D里的Singleton的问题

某些指针的类型转换,会造成指针值的变动。因此需要计算得出相对偏移,再用偏移换算出正确的地址值。
关于...

非常感谢,可以确定是偏移的问题,我用的是2008,不能有直观的测试,因为2008没有那些问题了,我用一段程序测试了一下,ms_Singleton最后的地址就是this的,没有偏移,多重继承也没有偏移。

4

主题

18

帖子

18

积分

新手上路

Rank: 1

积分
18
 楼主| 发表于 2009-10-17 17:33:00 | 显示全部楼层

Re:关于Ogre3D里的Singleton的问题

刚才测试了一下,地址不一样了,不过要明明白白的还需要把C++对象在内存中的布局弄的非常清楚,等有时间看看Stanley B.Lippman的《Inside The C++ Object Model》
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-8-6 23:07

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表