YUKI007BKB さんが書きました: ↑4年前
質問は,a はint型で4biteのはずですが,なぜ a→b のときに 8bite進んでいるのでしょうか?
バイトは、bite ではなく、byte です。
int型のオブジェクト(変数)のサイズは 4バイトで、メモリ上では
4バイト境界(4の倍数)にしか配置できません。すなわち、
0x7ffe805ec0c0~0x7ffe805ec0c3 のアドレスに配置できますが、
0x7ffe805ec0c1~0x7ffe805ec0c4 のアドレスに配置できまません。
double型のオブジェクト(変数)のサイズは 8バイトで、メモリ上では
8バイト境界にしか配置できません。
test.a の次のアドレスは 0x7ffe805ec0c4 ですが、これは 8バイト
境界ではありません。したがって、次の 8バイト境界である
0x7ffe805ec0c8 から test.b が始まるのです。
0x7ffe805ec0c4~0x7ffe805ec0c7 の 4バイトは、パディング(詰め物)
と呼ばれるもので、これは test.b が double型で 8バイト境界である
ことによりできたものです。
test.a の int型が 8バイト境界になったのではありません。
C の規格書では、alignment という用語を「境界調整」と翻訳しています。
また、「int型のオブジェクト(変数)のサイズは 4バイトで、メモリ上では
4バイト境界(4の倍数)にしか配置できません。」と書きましたが、
CPU によっては、どこからでも配置できるものがあります。
PC でよく使われているインテルの CPU がそうです。ただし、そういうこと
をするとメモリアクセスに時間がかかることになります。
スマートフォンなどに使われている ARM の CPU では不正な境界への
アクセスはできないようです。