構造体が境界調整されるのを回避する(パディング、アライメント)
構造体は境界調整される(パディング=詰め物、アライメント=調整)
コンパイラがデータをメモリに効率良い様に配置する。 奇数アドレスを避け、偶数アドレスにする。 処理系によっては2byte単位ではなく4byte単位になったりする。
typedef struct { char a; //ADDR=0x00 //padding_3byte int b; //ADDR=0x04 short c; //ADDR=0x08 //padding_2byte } T; //sizeof(T) == 12
このパディング、アライメントを回避する。
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)
参考