c++ - vs2010の可変配置

c++ c visual-studio-2010 gcc compiler-construction

コード:// VS2010

int a;
int b;
int c;
int d;

int main(){
    //output the address of global variables
    printf("0x%x, 0x%x, 0x%x, 0x%x\n", &a, &b, &c, &d);

    int a1, b1, c1, d1;
    //output the address of local variables
    printf("0x%x, 0x%x, 0x%x, 0x%x\n", &a1, &b1, &c1, &d1);

    int a2 = 1;
    int b2 = 2; int c2; int d2 = 4;
    //output the address of local variables
    printf("0x%x, 0x%x, 0x%x, 0x%x\n", &a2, &b2, &c2, &d2);
}


出力:

0x1197a44, 0x1197a3c, 0x1197a40, 0x1197a38
0x15fb00, 0x15faf4, 0x15fae8, 0x15fadc
0x15fad0, 0x15fac4, 0x15fab8, 0x15faac


私の質問:


Why are the global variables not stored in order?上記の出力は、それらが順不同であることを表しています。
Why are the local varialbes not stored continuously?上記の出力は、VS2010が2つごとに8バイトのスペースを挿入することを表しています。


誰かが私を助けることができますか?どうもありがとう!

- - - - - - - - - - - - - - - - - - - -補体 - - - - - --------------------------------

コード:\ gccバージョン4.6.1(Ubuntu / Linaro 4.6.1-9ubuntu3)

int a;
int b;
int c;
int d;

void main(){
        //output the address of global variables
    printf("%p, %p, %p, %p\n", &a, &b, &c, &d);

    int a1, b1, c1, d1;
        //output the address of local variables
    printf("%p, %p, %p, %p\n", &a1, &b1, &c1, &d1);

    int a2 = 1;
    int b2 = 2; int c2; int d2 = 4;
        //output the address of local variables
    printf("%p, %p, %p, %p\n", &a2, &b2, &c2, &d2);
}


出力:

0x60103c, 0x601034, 0x601038, 0x601030
0x7fff126253a0, 0x7fff126253a4, 0x7fff126253a8, 0x7fff126253ac
0x7fff126253b0, 0x7fff126253b4, 0x7fff126253b8, 0x7fff126253bc




gccでは、グローバル変数とローカル変数のアドレスは連続的で順序どおりです。

だから私は、vs2010が私たちのコードに対して何を、そしてなぜそれをするのか知りたいです。
答え
どちらも仕様で指定されていないため、コンパイラーは必要な処理を実行できます。

ローカル変数については、おそらくDEBUGビルドを使用しており、スタックの整合性をチェックするためにパディングが挿入されています。メモリのオーバーランが発生すると、パディングが上書きされ、オーバーランが検出されます。
関連記事

c++ - 実行時にモジュールをロードする理由

c++ - ReadFile()は空のデータを返します

c++ - HWND参照からのコールバックまたはWM_CLOSEを閉じる

c++ - QPlainTextEditでHTMLに保存

c++ - X位置を変更せずに長方形を積み上げる方法は?

c++ - VS2010は「コンパイラー生成関数の制御」をサポートしていますか?

c++ - OpenGLフルスクリーンレンダリング

c++ - クラスヘッダーファイル

c++ - constデータを使用してカスタムconst_iteratorを作成するにはどうすればよいですか?

c++ - tr1正規表現を使用して文字列が「数値のみ」かどうかを見つける