- ベストアンサー
構造体のサイズ
構造体のアライメントのことは少し知っていますが、 構造体のメンバを書く順を変えると、構造体のサイズが変わることってありますか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
たとえば、 #include <stdio.h> struct { char a; long b; char c; } x; struct { long b; char c; char a; } y; int main( int argxc, char *argv[] ){ printf( "%d?n", sizeof x ); printf( "%d?n", sizeof y ); } % cc a.c; ./a.out 12 8 ――とか。 PowerPC + Mac OS X + gcc IA32 + FreeBSD + gcc で試してます。
その他の回答 (2)
- V-bravo-U
- ベストアンサー率51% (155/301)
次のような場合もあります。 typedef struct test { int a; int b[]; }TEST; TEST test1 = {1,{9}}; TEST test2 = {2,{10,0}}; これもsizeofでそれぞれの変数または構造体タグを見ると おもしろい結果が得られます。また、これで表示される sizeofの結果は処理系依存なのでアシカラズ。 それから適切なアラインメントに整列された構造体は処理系に 依りますがメモリも処理速度も効率よく行わることに加え、 より移植しやすいデータ構造となります。 あと、一言釘を刺しておきますが、上記のプログラムは バグの元なのでb[]部を適切な数値を入れて明確な配列に してあげるか、ポインタにすることをお薦めします。 #ちょっとだけチャチャ >構造体のアライメントの法則を教えてください。 構造体のアラインメントを正確に説明するには処理環境が明確に する必要があります。本件は処理系依存、加えてコンパイラ設定 依存になりますので、ご使用のコンパイラとOS環境を教えて いただきませんと、異なる結果がここに書かれる可能性があります。
- gatyan
- ベストアンサー率41% (160/385)
あると思いますよ。(型が混在する場合) char a; int b; char c を char a; char c; int b; にするような場合、char はバイト境界,int はワード境界という制約がかかるだけでも。 ワード=2バイト=intのサイズだと、最初の方は5バイト後のは4バイト必要になりますね。 80x86系で、intもバイト境界OKにすれば同じになりますが、実行速度は落ちるはずです。
お礼
ありがとうございました。 その場合、intが最大だからsizeof(int)=4だとして 4の箱をいくつか用意して、ソースの上の方から、箱の 左の方から埋めていく方法を考えました。 1234 1234 1234 └────┘└────┘└────┘ 前者 a 234 b c 234 └────┘└────┘└────┘ 後者 a c 34 b └────┘└────┘ 箱の単位が構造体のサイズ。 このような考え方でいいですよね? HTMLだとずれて見えますけど。
補足
ありがとうございました。 僕も 12 と 8 でした。 そのメンバ中の最大型のメンバの整数倍になるように、構造体のサイズは切り上げられる と思っていたんですが、違っていたことが今分かりました。 構造体のアライメントの法則を教えてください。