日期:2014-05-16  浏览次数:21114 次

g++编译优化选项-O2对位域操作的影响
最近在linux环境下做开发,碰到一个奇怪的问题。在用g++编译时,使用-O2选项和不使用此选项程序执行的结果竟然不一样。通过分析,发现问题可能出在-O2编译选项对位域操作的影响上,但具体为什么解释不了,看那位能帮忙分析一下。贴上测试代码

//Test.cpp
#include <stdio.h>
struct stTest
{
unsigned int sx : 8;
unsigned int sy : 8;
unsigned int lx : 6;
unsigned int ly : 6;
unsigned int sc : 4;
};

unsigned int Test()
{
stTest s;
s.sx = 1;
s.sy = 2;
s.lx = 3;
s.ly = 4;
s.sc = 5;

return *(unsigned int *)&s;
}

int main()
{
unsigned int uiTmp = Test();
printf("%u", uiTmp);
return 0;
}

g++ test.cpp
./a.out
执行结果:1359151617

g++ -O2 test.cpp
./a.out
执行结果:1359152608
------解决方案--------------------
无法重现
gcc 版本 4.8.2 20131212 (Red Hat 4.8.2-7) (GCC)
[jimmy@xxxxxxx  workspace-cpp]$ g++ a.cpp
[jimmy@xxxxxxx workspace-cpp]$ ./a.out
1359151617[jimmy@G08FNSTD131714 workspace-cpp]$ g++ -O2 a.cpp
[jimmy@xxxxxxxx workspace-cpp]$ ./a.out
1359151617

------解决方案--------------------
编译运行结果:1359151617
                             1359151104(g++ -O2)
g++版本:4.1.2
看来-O2确实对位移进行了部分优化,不同的编译器版本优化的程度不一样。