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

経験に基づいた推測:

最適化されると、in bar() の初期化は使用されないため、最適化されなくなります。おそらく、bar() の呼び出しも削除されます。したがって、予想どおり、foo() はガベージを出力します。これは、その時点でそのメモリ スロット (またはレジスタ) にたまたまあるものです。

于 2012-05-21T08:02:14.573 に答える
1

a最初の関数では初期化されていません。つまり、特定の値を持つことは期待できません。したがって、コンパイラの動作はどちらの場合も正しいです (最適化なしで 42 になるのは単なる偶然です)。

于 2012-05-21T07:53:08.037 に答える