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]
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值