1. 编译器通常会使结构体强制对齐.
这里默认使用VC编译器,默认8bytes 对齐的,
对于结构体
struct struct_x {
char a; // 1 byte
int b; // 4 bytes
short c; // 2 bytes
char d; // 1 byte
} ;
编译器会自动插入一些pad
struct struct_x {
char a; // 1 byte
char _pad0[3]; // padding to put 'b' on 4-byte boundary
int b; // 4 bytes
short c; // 2 bytes
char d; // 1 byte
char _pad1[1]; // padding to make sizeof(x_) multiple of 4
}
所以sizeof(struct_x) 的返回值会是 12 bytes.
char _pad0[3] 使 int b 成员 4字节对齐;
(这里如果是double b;的话,因为double类型长是8字节的,所以变量b会被编译器强制8 bytes对齐
这样就需要插入char_pad0[7] 了);
char _pad1[1] 使结构体每个成员都对齐;
(试想一下,如果这个字节不插入, 则定义类似结构体数组 strcut my_struct x[3] 的时候,x[1]就无法对齐了.)
2. 对于嵌套定义结构体的话,编译器会按嵌套的数据成