新人发帖,有问题欢迎指正.
有这么个问题,google半天无果. 文字描述是这样的:有一个class,在它的构造函数内部,调用了它自己的一个成员函数,这个成员函数内部,对它的一个成员变量进行赋值.但是发现在release版(-o2)中成员变量并没有被赋值.debug版(-od)是赋值成功的.
环境:VC2005, C++语言.
下面是代码: // b.h class B : public A { public: B(uint32 type); virtual ~B(); void setVersion(uint8 version) { mVersionFlags = ((mVersionFlags&0x00FFFFFF)|(((uint32)version)<<24)); } void setFlags(uint32 flags) { mVersionFlags = ((mVersionFlags&0xFF000000)|(flags&0x00FFFFFF)); } // other member functions here protected: uint32 mVersionFlags; };
// b.cpp B::B(uint32 type) : A(type) { setVersion(0); // 这里调用了自己的成员函数,对mVersionFlags进行初始化 setFlags(0); }
// c.h class C : public B { public: C(): B(TYPE) { printf("vf: %x\n", mVersionFlags); } // 这里将父类B的成员变量打印出来,输出为非零值,而且每次运行的结果都不一样 enum { TYPE = FOURCC('c','c','c','c') }; // other member functions and varibles here };
问题:如上所示,在class C的构造函数里打印,发现B的成员变量没有被初始化.这个问题仅出现于release版(-o2优化),debug版(-od)不出现.
做过一些尝试,有些办法可以解决,有些不行. 这些办法都可以:
// 办法1: // b.cpp B::B(uint32 type) : A(type) , mVersionFlags(0) // 办法1: 放在初始化列表里 { }
// 办法2: // b.cpp B::B(uint32 type) : A(type) { setVersion(0); setFlags(0); printf("vf1: %x\n", mVersionFlags); // 办法2: 使用一下mVersionFlags. 这样好像编译器就不会优化掉了 }
// 办法3: // b.cpp B::B(uint32 type) : A(type) { // 办法3: 直接将之前两个成员函数的函数体替换到这里,也能解决问题 { mVersionFlags = ((mVersionFlags&0x00FFFFFF)|(((uint32)version)<<24)); } { mVersionFlags = ((mVersionFlags&0xFF000000)|(flags&0x00FFFFFF)); } }
// 办法4: // b.h class B : public A { public: B(uint32 type); virtual ~B(); void setVersion(uint8 version) { mVersionFlags = ((mVersionFlags&0x00FFFFFF)|(((uint32)version)<<24)); } void setFlags(uint32 flags) { mVersionFlags = ((mVersionFlags&0xFF000000)|(flags&0x00FFFFFF)); } // other member functions here protected: volatile uint32 mVersionFlags; // 办法4: 增加volatile标记 };
最终我使用了办法4.但是现在的问题是我还是不清楚为什么.哪位大侠能给个提示.
关注!###### 构造函数里面没有对mVersionFlags 初始化。
######在debug下mVersionFlags的初始值是0,但在release下却不是这样######FOURCC是干什么的?我把FOURCC那个TYPE改成=0之后,用-O2和-g都是可以正确出结果的。。(为了防止初始值是0,我在B的构造函数里面还把 setVersion(0); setFlags(0);的参数改成了1,也没问题。。)
compiled by g++ (GCC) 4.8.1 20130725 (prerelease)######我现在也遇到了同样的问题,不知老兄你是怎么解决的,万望指教
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。