構造体が境界調整されるのを回避する(パディング、アライメント)

構造体は境界調整される(パディング=詰め物、アライメント=調整)

コンパイラがデータをメモリに効率良い様に配置する。 奇数アドレスを避け、偶数アドレスにする。 処理系によっては2byte単位ではなく4byte単位になったりする。

typedef struct {
    char  a;    //ADDR=0x00
    //padding_3byte
    int   b;    //ADDR=0x04
    short c;    //ADDR=0x08
    //padding_2byte
} T;            //sizeof(T) == 12

このパディング、アライメントを回避する。

gcc

typedef struct {
    //略
} T __attribute__((__packed__))

g++, VC++

#pragma pack(push, 1)   //1byte
typedef struct {
    //略
} T;
#pragma pack(pop)

パディングなしだとアドレス、サイズが変わる。

#pragma pack(push, 1)
typedef struct {
    char  a;    //ADDR=0x00
    int   b;    //ADDR=0x01
    short c;    //ADDR=0x05
} T;            //sizeof(T) == 7
#pragma pack(pop)

参考