简单解释 C / C++ 字节对齐
首先,引入两个概念“数据类型大小”和“指定对齐值”:
数据类型大小:char 为1 个字节,short 为2 个字节,int 为4 个字节,double为8 个字节等等;
指定对齐值:#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,起始地址为12,没有间隔,a4 占4 个字节;
a6 的有效对齐值为1,由于条件A,起始地址为15,没有间隔,a5 占1 个字节;
由于条件B,最大有效对齐值为4,总长度为4 的倍数, 结构体最后补3 个字节。
所以,上述结构体总共大小为24 个字节
摘自:杨卓荦的技术专栏
补充:软件开发 , C++ ,