c语言结构体对齐

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


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指定的大小)的边界上。


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


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


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


实例:

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



你可能感兴趣的:(c语言结构体对齐)