简单解释 C / C++ 字节对齐

首先,引入两个概念“数据类型大小”和“指定对齐值”:

  1. 数据类型大小:char 为 1 个字节,short 为 2 个字节,int 为 4 个字节,double为 8 个字节等等;
  2. 指定对齐值:#pragma pack (value) 所指定的对齐的值,例如 g++ 4.5.2 x86 默认值为 4;

引入一个重要的概念——有效对齐值 N:

有效对齐值 N = min( (1), (2)),即:“数据类型大小”与“指定对齐值”的最小值

在 C / C++ 语言中,需要同时满足如下A、B两个条件:

  • 条件A:结构体(struct)的数据成员的 起始地址 addr_start 需要是有效对齐值 N的整数倍,即 addr_start % N == 0;
  • 条件B:结构体(struct)的大小必须是 所有成员变量的最大有效对齐值 max_N 的整数倍,即 sizeof(struct) % max_N == 0。
例如:
struct a {
        char a1;
        short a2;
        short a3;
        double a4;
        int a5;
        char a6;
};
笔者机器的默认指定对齐值为4,分析:
  • a1 的有效对齐值为 1,起始地址为 0,占 1 个字节
  • a2 的有效对齐值为 2,由于条件 A,起始地址为 2,a1与a2之间 空 1 个字节a2占 2 个字节
  • a3 的有效对齐值为 2,由于条件 A,起始地址为 4,没有间隔,a3 占 2 个字节
  • a4 的有效对齐值为 4,由于条件 A,起始地址为 8,没有间隔,a4 占 8 个字节
  • a5 的有效对齐值为 4,由于条件 A,起始地址为 16,没有间隔,a4 占 4 个字节
  • a6 的有效对齐值为 1,由于条件 A,起始地址为 20,没有间隔, a5 占 1 个字节
  • 由于条件 B,最大有效对齐值为 4,总长度为 4 的倍数, 结构体最后补 3 个字节
所以,上述结构体总共大小为 24 个字节。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值