在 Clang 中添加优化标志后值发生变化
value changes after adding optimization flag in Clang
我写了一个小程序:
#include <stdio.h>
void tester() {
int x = 69;
}
void x() {
int x;
printf("%d\n", x);
}
int main() {
tester();
x();
}
我希望打印出 69。当我在没有优化的情况下编译时它打印出 69,但是对于 O1-O3,它打印出大量数字。这是为什么?
这2个x变量是完全不同的东西,只是碰巧同名而已。如果您希望它与 x 相同,那么您必须创建一个全局变量
int x;
void tester() {
x = 69;
}
void xx() {
printf("%d\n", x);
}
int main() {
tester();
xx();
}
尝试读取从未获取其地址的未初始化变量会触发 undefined behavior,这基本上意味着程序不需要以任何特定方式运行。
很明显,您试图在函数 x
中使用未初始化的变量 x
来获取 tester
中 x
的“剩余”值。禁用优化后,这就是它的工作方式。启用优化后,编译器会利用未定义的行为假设它不会发生,并根据该事实进行某些优化。
因此,启用优化后,编译器基本上假设您不会读取未初始化的变量,这就是您看到不同输出的原因。
我写了一个小程序:
#include <stdio.h>
void tester() {
int x = 69;
}
void x() {
int x;
printf("%d\n", x);
}
int main() {
tester();
x();
}
我希望打印出 69。当我在没有优化的情况下编译时它打印出 69,但是对于 O1-O3,它打印出大量数字。这是为什么?
这2个x变量是完全不同的东西,只是碰巧同名而已。如果您希望它与 x 相同,那么您必须创建一个全局变量
int x;
void tester() {
x = 69;
}
void xx() {
printf("%d\n", x);
}
int main() {
tester();
xx();
}
尝试读取从未获取其地址的未初始化变量会触发 undefined behavior,这基本上意味着程序不需要以任何特定方式运行。
很明显,您试图在函数 x
中使用未初始化的变量 x
来获取 tester
中 x
的“剩余”值。禁用优化后,这就是它的工作方式。启用优化后,编译器会利用未定义的行为假设它不会发生,并根据该事实进行某些优化。
因此,启用优化后,编译器基本上假设您不会读取未初始化的变量,这就是您看到不同输出的原因。