今天遇到一个结构体没有对齐的问题,导致指向结构体的指针递增的时候,偏移出错。
struct x{
uint64 a;
uint16 b;
uint16 c;
uint32 d;
uint8 arr[4];
}
如果编译器选择8字节(Packs structures on 8-byte boundaries (default).)对齐,那么这个结构体的大小是多少呢?
答案是:8+2+2+4+4+4 = 24;
MSDN是这样说的:
When you specify this option, each structure member after the first is stored on either the size of the member type orn-byte boundaries (where n is 1, 2, 4, 8, or 16), whichever is smaller.
第一个成员之后的成员放置在min(自身大小,Zpn指定的大小)的边界上。
1, 所以结构体对齐,包含2个方面,一个成员的对齐,还有就是最后整个结构体的对齐。
2, 一般情况下设置对齐大小是实际机器大小的整数倍,一般就是一倍,也就是相等。
实例:
// compile with /Zp:4
struct x{
int32 a;
char b;
int16 c;
char arr[5]
}