こんばんは。きわさです。
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
になりましたとさ。
