2009-04-18 9 views
3

私は見ている振る舞いを説明する方法がわかりませんが、ここにはあります。関数内の変数を置き換えるMSコンパイラの最適化?

私は3つのパラメータ、ポインタ、int、および別のポインタをとる関数fooを持っています。 fooの中でブレークポイントを設定すると、すべての変数が必要な値であることがわかります。しかし、私がローカル変数宣言を超えて降りると、パラメータの1つ(int)が突然ゼロに変わります。しかし、残りの関数は元の値であるかのように実行されるため、すべて正常です。

これは完全なデバッグでは発生しませんが、通常のデバッグでは発生します。これはある種の最適化ですか?もしそうなら、それは何と呼ばれ、どこで詳細を得ることができますか?

例:あなたが最適化されたコードをデバッグしている

void foo(void *A, int B, void *C) 
{ 
    // B == 5 
    int X = 3; 
    char *Y = getSomeStaticString(); 
    // ... some other variable declarations like the above 

    // B, according to the debugger, is now 0 
    if (B == 5) { 
    // But this still executes 
    } 
} 

答えて

6

。ローカル変数は信頼できません。コンパイラは自由に空間を再利用したり、レジスタにキャッシュしたりできます。

あなたが見ているのは、Bがレジスタにキャッシュされていて、スタック位置が他の変数に再利用されていることです。

ここで似たような質問:Can optimizations affect the ability to debug a VC++ app using its PDB?

+0

それでした!ありがとう – Sydius

関連する問題