ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。

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

A 回答 (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
で試してます。

この回答への補足

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

補足日時:2003/09/01 23:44
    • good
    • 0

 次のような場合もあります。


typedefstruct test
{
inta;
intb[];
}TEST;

TEST test1 = {1,{9}};
TEST test2 = {2,{10,0}};

 これもsizeofでそれぞれの変数または構造体タグを見ると
おもしろい結果が得られます。また、これで表示される
sizeofの結果は処理系依存なのでアシカラズ。

 それから適切なアラインメントに整列された構造体は処理系に
依りますがメモリも処理速度も効率よく行わることに加え、
より移植しやすいデータ構造となります。

 あと、一言釘を刺しておきますが、上記のプログラムは
バグの元なのでb[]部を適切な数値を入れて明確な配列に
してあげるか、ポインタにすることをお薦めします。


#ちょっとだけチャチャ
>構造体のアライメントの法則を教えてください。
 構造体のアラインメントを正確に説明するには処理環境が明確に
する必要があります。本件は処理系依存、加えてコンパイラ設定
依存になりますので、ご使用のコンパイラとOS環境を教えて
いただきませんと、異なる結果がここに書かれる可能性があります。
    • good
    • 0

あると思いますよ。

(型が混在する場合)
char a;
int b;
char c

char a;
char c;
int b;
にするような場合、char はバイト境界,int はワード境界という制約がかかるだけでも。
ワード=2バイト=intのサイズだと、最初の方は5バイト後のは4バイト必要になりますね。
80x86系で、intもバイト境界OKにすれば同じになりますが、実行速度は落ちるはずです。
    • good
    • 0
この回答へのお礼

ありがとうございました。

その場合、intが最大だからsizeof(int)=4だとして
4の箱をいくつか用意して、ソースの上の方から、箱の
左の方から埋めていく方法を考えました。

 1234  1234  1234
└────┘└────┘└────┘

前者
 a 234  b      c 234
└────┘└────┘└────┘

後者
 a c 34  b
└────┘└────┘

箱の単位が構造体のサイズ。

このような考え方でいいですよね?
HTMLだとずれて見えますけど。

お礼日時:2003/09/02 00:07

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!