は下の下でコードを切り取ら:func_1()
後未定義変数とコンパイラの最適化
---それがスタックにA
を押して40にそのメモリの値を設定しますスタックからA
をポップします。
func_2()
後---それが再びスタックにA
を押して前に設定された値を継承し、我々がB
にfunc_2()
で名前A
を変更した場合、プリントアウトは、値が40
void func_1()
{ int A = 40;}
void func_2()
{ int A; printf("%d/n",A);}
void main (void)
{
func_1();
func_2();
}
になりますでしょうスタックの使用をテストし、名前付き変数のプールの使用をテストするために余分なコードを置く:私のコンピュータ上で
int A; printf("%d\n", A);
、それは、B
が40であると言いますコンパイラがコンパイルされたコード(?)を最適化するために再利用される名前付き変数のプールを持っている場合、なぜA
に0が得られたのですか? コンパイラはいつプールを使用しますか?
私の質問は、このスライドに基づいています:http://www.slideshare.net/olvemaudal/deep-c/131-I_am_now_going_to
これは、コンパイラに大きく依存するように聞こえます。しかし、私が正しく理解していれば、 'func_2'で' B'と 'A'を出力します。つまり、' B'を最初に割り当てるので、スタックに最後にあったものの値をとります'func_1'から)、次の割り当て(' func_2'からの 'A')はそれ以降のバイトになります。 – Iluvatar
名前をAからBに変更しても、「スタックの使用をテストする」ことはできません。 「名前付き変数のプール」のようなものはありません。あなたが何を求めているのか不明です。 – EJP
特定のアーキテクチャがなければ、自動変数のスタックまたはその他の特定のメモリモデルを想定することはできません。そして「プール」はどういう意味ですか?これはこの文脈では意味がありません。名前(識別子)は、それらが識別するオブジェクトの他のプロパティと共にシンボルテーブルにあります。 – Olaf