在本演示文稿的幻灯片 137-140 中,提到 bar(( 甚至 foo(( 被编译为此示例程序的内联函数,导致在正常构建中打印出 a 是 42,即使它在技术上应该是垃圾。您是否碰巧知道为什么优化器启动时输出垃圾符合预期?
我已经包含了源代码
#include <stdio.h>
void foo(void)
{
int a;
printf("%dn", a);
}
void bar(void)
{
int a = 42;
}
int main(void)
{
bar();
foo();
return 0;
}
和命令提示符打印输出以供参考。
$ cc foo.c && ./a.out
42
$ cc -O foo.c && ./a.out
1606415608
只是一个有根据的猜测:
在非优化的情况下,编译器为 bar(( 中的 a 变量保留一个空间,并将其初始化为 42。然后,当调用 foo(( 时,它对未初始化的 a 使用相同的空格并打印出 42。
当它被优化时,in bar(( 的初始化被优化掉,因为它没有被使用。可能,甚至取消了对 bar(( 的调用。因此,正如预期的那样,foo(( 打印出垃圾,即当时该内存插槽(或寄存器(中碰巧的任何东西。
>a
在第一个函数中未初始化,这意味着你不能期望它有任何特定的值。因此,编译器的行为在这两种情况下都是正确的(在没有优化的情况下得到 42 只是一个巧合(。