正常和优化构建之间的正确返回值

时间:2012-05-21 07:50:04

标签: c compiler-construction

this presentation的幻灯片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

提前感谢您的解释。

2 个答案:

答案 0 :(得分:2)

只是一个有根据的猜测:

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

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

答案 1 :(得分:0)

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