关于全局对象

      前端时间在查一些全局对象相关的问题,游戏客户端在极个别机器上启动不起来,底层内存消耗比较异常。将问题段代码放到程序的最前,问题依旧,推测是部分全局对象的初始化不恰当写乱了内存。

 

      全局对象的初始化时机,堆栈上能看到调用点,在全局对象的初始化上设断点,Call Stack 能看到

 

            _initterm()                      CRT0DAT.c

            WinMainCRTStartup()     CRTEXE.c

 

      比较杯具的是,试图跟踪这个函数来获取全局对象的初始化顺序比较困难

 

      全局对象的初始化顺序,是可以控制的 http://support.microsoft.com/kb/104248/en-us ,但这个不适用于正常的产品,调试测试之类的用大概比较合适

 

      正常情况下初始化的顺序应该是链接的顺序,IDE中测试的结果,和工程依赖/头文件字典序都有一定关系

 

 

      附加资料 http://www.lurklurk.org/linkers/linkers.html

 

 

 

 

      全局对象这种初始化顺序的难以控制性,对代码的健壮性会产生糟糕的影响,因此应该尽量少的使用全局对象

 

 

 

      目前正在把大部分全局对象往单体类转,遇到的相关问题有

 

a. 全局对象的数据成员会被自动初始化为0,但单体类就不再提供这个默认条件。在原先构造函数未好好的给数据成员初始化的情况下,要把这部分初始化补足才能和原代码保持一致;

b. 光是全局的简单变量来说,应该尽量都初始化,使之成为强符号,避免多个弱符号产生不确定性

 

http://docs.sun.com/app/docs/doc/819-7050/6n918j8mo?l=zh&a=view

 

 

      代码中充斥着自定义struct,且没有默认构造函数,试图增加一个,可是这样就不再是Aggregates(http://msdn.microsoft.com/en-us/library/sdwe79a4(v=VS.100).aspx),导致不可使用initializer list(http://msdn.microsoft.com/en-us/library/0s6730bb(VS.80).aspx) 改动要动无数代码……先放弃了,听同事说新标准准备支持这个……嘛,等到2012不知道能不能看见

 

      P.S. 中英文夹杂不是咱蛋疼……避免误用中文术语直接先用原文了,等找到合适的再换回来吧

 

     

 

 

                

你可能感兴趣的:(关于全局对象)