前端时间在查一些全局对象相关的问题,游戏客户端在极个别机器上启动不起来,底层内存消耗比较异常。将问题段代码放到程序的最前,问题依旧,推测是部分全局对象的初始化不恰当写乱了内存。
全局对象的初始化时机,堆栈上能看到调用点,在全局对象的初始化上设断点,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. 中英文夹杂不是咱蛋疼……避免误用中文术语直接先用原文了,等找到合适的再换回来吧