【发布时间】:2011-03-04 15:29:06
【问题描述】:
如果没有 -O2,此代码将打印 84 84,如果带有 O2 标志,则输出为 84 42。该代码是在 64 位 Linux 平台上使用 gcc 4.4.3. 编译的。为什么以下代码的输出不同?
请注意,使用 -Os 编译时,输出为 0 42
#include <iostream>
using namespace std;
int main() {
long long n = 42;
int *p = (int *)&n;
*p <<= 1;
cout << *p << " " << n << endl;
return 0;
}
【问题讨论】:
-
g++ 4.5.2 在 x86_64 linux 上使用 -O0、-O1、-O2、-O3 和 -Os 打印
84 84 -
g++ 4.5.0 在 64 位 Windows 上以任何优化级别打印
84 84。 -
我相信
int *p = (int *)&n;这行的结果取决于机器的字节序! -
你为什么使用
int*到long long? -
我能够重现 g++ 4.4.4 的问题。看起来 4.4 分支有一个在 4.5 中修复的错误/功能。
标签: c++ gcc 64-bit compiler-optimization strict-aliasing