こんばんは。きわさです。
C言語の構造体のサイズ取得にハマったので、備忘録として残しておきます。
今回はC言語編です。
さて、まずはこれ。
printf("char: %d\n", sizeof(char)); printf("short: %d\n", sizeof(short)); printf("int: %d\n", sizeof(int));
結果は、こうなりました。
char: 1
short: 2
int: 4
では、
次は例えばこのような構造体が定義されていたとして、
typedef struct { char x1; char x2; char x3; char x4; char x5; } st1_t; typedef struct { short x1; short x2; int x3; char x4; char x5; } st2_t; typedef struct { char x1; int x2; char x3; short x4; int x5; } st3_t; typedef struct { short x1; int x2; char x3; int x4; short x5; } st4_t;
結果はどうなるでしょう。
printf("st1_t: %d\n", sizeof(st1_t)); printf("st2_t: %d\n", sizeof(st2_t)); printf("st3_t: %d\n", sizeof(st3_t)); printf("st4_t: %d\n", sizeof(st4_t));
結果は、
st1_t: 5
st2_t: 10
st3_t: 12
st4_t: 13
。。。
に、なると思っていました。
が、なりませんでした。
結果は、
st1_t: 5
st2_t: 12
st3_t: 16
st4_t: 20
!?
そう、冴えない僕には理由もわからず、どハマりしました。
どうやらアラインメントが~、なんちゃら~、とのこと。
ここで詳しい解説は省きますが、
4バイト区切りでキリのよくなるようパディングされるらしい。
へ、へー、なるほどー。
そこで、このように、
#pragma pack(1) typedef struct { char x1; char x2; char x3; char x4; char x5; } st1_t; typedef struct { short x1; short x2; int x3; char x4; char x5; } st2_t; typedef struct { char x1; int x2; char x3; short x4; int x5; } st3_t; typedef struct { short x1; int x2; char x3; int x4; short x5; } st4_t; #pragma pack()
この#pragma pack(1)で区切りを1にすることで、
結果、
st1_t: 5
st2_t: 10
st3_t: 12
st4_t: 13
になりましたとさ。