• ベストアンサー

構造体のサイズ

構造体のアライメントのことは少し知っていますが、 構造体のメンバを書く順を変えると、構造体のサイズが変わることってありますか?

質問者が選んだベストアンサー

  • ベストアンサー
  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.1

たとえば、 #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 で試してます。

iufansu
質問者

補足

ありがとうございました。 僕も 12 と 8 でした。 そのメンバ中の最大型のメンバの整数倍になるように、構造体のサイズは切り上げられる と思っていたんですが、違っていたことが今分かりました。 構造体のアライメントの法則を教えてください。

その他の回答 (2)

  • V-bravo-U
  • ベストアンサー率51% (155/301)
回答No.3

 次のような場合もあります。 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)
回答No.2

あると思いますよ。(型が混在する場合) char a; int b; char c を char a; char c; int b; にするような場合、char はバイト境界,int はワード境界という制約がかかるだけでも。 ワード=2バイト=intのサイズだと、最初の方は5バイト後のは4バイト必要になりますね。 80x86系で、intもバイト境界OKにすれば同じになりますが、実行速度は落ちるはずです。

iufansu
質問者

お礼

ありがとうございました。 その場合、intが最大だからsizeof(int)=4だとして 4の箱をいくつか用意して、ソースの上の方から、箱の 左の方から埋めていく方法を考えました。  1234  1234  1234 └────┘└────┘└────┘ 前者  a 234  b      c 234 └────┘└────┘└────┘ 後者  a c 34  b └────┘└────┘ 箱の単位が構造体のサイズ。 このような考え方でいいですよね? HTMLだとずれて見えますけど。

関連するQ&A