2016-11-07 14 views
1

関数の先頭に変数の定義があり、後で宣言したときに生成されるコードの違いは何ですか?例:関数の先頭で宣言された変数と後で宣言された変数の差

int f(int parameter) { 
int a = parameter * 2; 
if (a == 4) 
    return 1; 
int b = parameter * 4; 
if (b == 4) 
    return 2; 
return 0; 
} 

い出力コードif (a == 4)b変数の初期化や割り当てを持っているかab変数が同じ瞬間に初期化されます?。

+1

違いはありません。分解を確認してください。ところで、あなたのコードの中の変数はどれも 'static'です。 –

+3

「機能の上に」も機能の中にあります。 – plasmacel

+1

タイトルの「静的」を編集しました。 – glglgl

答えて

7

が実際にになるようにするには、生成されたアセンブラを見てください。

ほとんどのコンパイラは、領域の割り当てに関して、関数の先頭にある関数で使用されているすべての変数について、スタックに十分な領域を割り当てます。で定義されている(これはは次のように発生するはありませんが、私はこのように動作しない任意のコンパイラを知りません。)

初期化の面では、抽象マシン( CおよびC++標準)は、初期化(つまり、初期値の設定)をさまざまな時点で起こったものとして扱います。 bは、aと4の比較後に初期化されます。

もちろん、as-ifルールでは、初期化に副作用がない場合、コンパイラは初期化ラウンドを適切な方向に移動できます。 C++の初期化子は他の翻訳単位でコンストラクタを使用することが多く、コンパイラはそこに副作用があるかどうかを見ることができないため、C++よりも頻繁に発生します。

この単純なケースでは、最適化すると、abの両方がレジスタに格納される可能性があります。これは同じレジスタである可能性があります。 (これは、int変数を使用していて、abを重複しないためです)。

関連する問題