- ベストアンサー
C言語の構造体のサイズについて
- C言語の構造体のサイズについて、sizeof演算子を使用してサイズを取得すると、一部のメンバーのサイズの値が異なる現象が起きることがあります。
- これは、メンバーのアライメント(メモリ上の配置)に関連しています。
- また、プラットフォームやコンパイラのバージョンによってもサイズが異なることがあります。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
「構造体 パディング」で検索すれば分かります。 charのサイズを1バイト、shortのサイズを2バイト、intのサイズを4バイトとした場合、 CPUによっては short のアドレスを2の倍数に、int のアドレスを4の倍数にしないといけない場合が有ります。 そうでない場合でも、short のアドレスが2の倍数でないときにメモリをshort として読みだすと2回のメモリの読み出しが必要になったりする事が有ります。 そうするとにプログラムの実行速度が低下します。 そういう事を避けるため、charでない変数のアドレスを全て2又は4の倍数になる様に配置するのが普通です。 例えば、 typedef struct B { short code; char name; float price; } B; の場合、 short code; 2バイト char name; 1バイト (詰め物 1バイト) float price; 8バイト 合計12バイト のようになります。 次の場合、 typedef struct X { char A ; short B; char C ; short D ; } X; char A ; 1バイト (詰め物 3バイト) short B; 2ばいと (詰め物 2バイト) char C ; 1バイト (詰め物 3バイト) short D ; 2バイト なのに対し、次のようにすると typedef struct X { short B; 2バイト short D ; 2バイト char A ; 1バイト char C ; 1バイト } X; となります。 実際の詰め物がどういうサイズになるかは環境によって異なります。 コンパイラによっては詰め物を使わないようにするオプションを付けられる場合が有りますので 実行速度を犠牲にしてでもメモリサイズを小さくしたい場合に利用できます。
その他の回答 (1)
- siffon9
- ベストアンサー率64% (136/211)
宣言した構造体の各メンバのアドレスを確認するとおわかりになると思いますが、char型の前後では空き領域が発生することがあります。空き領域のサイズは処理系に依存しますね。 これはメモリの利用効率よりもCPU等のメモリアクセスの効率を優先している為だと思います。 #include <stdio.h> typedef struct B { short code; char name; float price; } B; int main(void){ B aaa; printf("size of B = %d\n",sizeof(B)); printf("size of short = %d\n",sizeof(short)); printf("size of char = %d\n",sizeof(char)); printf("size of float = %d\n",sizeof(float)); printf("code address = %p\n",&aaa.code); printf("name address = %p\n",&aaa.name); printf("price address = %p\n",&aaa.price); return 0; } 私の環境での実行結果 ~/test$ gcc test.c ~/test$ ./a.exe size of B = 8 size of short = 2 size of char = 1 size of float = 4 code address = 0022FF48 name address = 0022FF4A ←priceとの間に1Byte空きがある price address = 0022FF4C