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