c语言结构体对齐

来源:互联网 发布:淘宝买家延迟收货时间 编辑:程序博客网 时间:2024/06/05 07:56

今天遇到一个结构体没有对齐的问题,导致指向结构体的指针递增的时候,偏移出错。


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 (wheren is 1, 2, 4, 8, or 16), whichever is smaller.

第一个成员之后的成员放置在min(自身大小,Zpn指定的大小)的边界上。


一开始以为是2个uint16造成的不对齐,实际上是struct结构体本身也需要对齐的原因,因为如果你分配一个数组(假设分配器第一个机构体放在8字节的边界上),这个结构体本身不是8字节对齐,那么,第二个元素的所有成员就不是按照预想的那样对齐了(不同于第一个元素)。


1, 所以结构体对齐,包含2个方面,一个成员的对齐,还有就是最后整个结构体的对齐。


2, 一般情况下设置对齐大小是实际机器大小的整数倍,一般就是一倍,也就是相等。


实例:

// compile with /Zp:4struct x{  int32 a;  char  b;  int16 c;  char  arr[5]}



原创粉丝点击