0

本演示文稿的幻灯片 137-140 中,提到 bar() 甚至可能 foo() 被编译为该示例程序的内联函数,导致在正常构建中打印输出为 42,即使它在技术上应该是垃圾. 您是否碰巧知道优化器启动时为什么输出垃圾如预期?

我已经包含了源代码

#include <stdio.h>
void foo(void)
{
    int a;
    printf("%d\n", 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
4

2 回答 2

2

只是一个有根据的猜测:

在未优化的情况下,编译器为 bar() 中的 a 变量保留一个空间并将其初始化为 42。然后,当调用 foo() 时,它为未初始化的 a 使用相同的空间并打印出 42。

当它被优化时, bar() 中的 a 的初始化被优化掉了,因为它没有被使用。可能甚至消除了对 bar() 的调用。因此,正如预期的那样, foo() 打印出垃圾,即当时该内存插槽(或寄存器)中发生的任何事情。

于 2012-05-21T08:02:14.573 回答
1

a在第一个函数中未初始化,这意味着您不能期望它具有任何特定值。所以编译器的行为在这两种情况下都是正确的(你得到 42 没有优化只是一个巧合)。

于 2012-05-21T07:53:08.037 回答