2

64ビットのubuntu Linuxでのメモリ割り当てについてお聞きしたいです。

次のコードがあります

#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[]) {
    char buffer_one[8], buffer_two[8];

    printf("Size of char: %u\n", sizeof(char));

    printf("Buffer_two is at %p\n", buffer_two);
    printf("Buffer_one is at %p\n", buffer_one);
}

実行すると、次の結果が表示されます

$ ./sizeofchar 
Size of char: 1
Buffer_two is at 0x7fff98069910
Buffer_one is at 0x7fff98069900

私の質問は、char 型のサイズが 1 バイトであっても (ここで間違っている場合は修正してください) Buffer_two、隣り合って割り当てられていると思いますが、メモリアドレスとメモリアドレスが 16 バイト離れて割り当てられるBuffer_oneのはなぜですか。Buffer_twoBuffer_one

4

1 に答える 1

6

これはコンパイラに依存する動作です。これらはスタックに割り当てられたバッファーであるため (実際にはメモリ割り当てとは関係ありません)、スタック ローカル変数がスタック内でどのように配置されるかはコンパイラ次第です。これで遊ぶこともできますが、何らかの理由で、すべての配列が 16 バイト単位でスタックに割り当てられていると思います。

逆アセンブリを見ると、スタック フレームのどこに変数が設定されているかがわかります。achar[2]char[15]両方とも、スタック フレームで 16 バイトを使用することになるという予感があります。よくわかりません。ただし、追加できるのは、x64 ABIでは、スタックが常に 16 バイトにアラインされていることが指定されており、このタイプの割り当てにより、それを簡単に保証できるということです。

于 2012-06-18T15:05:29.170 に答える