知识补全-内存对齐时,padding是由读取的块的大小决定的吗

管理员
**padding 不是由"CPU一次读取块大小"决定的,而是由每个数据类型自身的对齐要求决定的。** 对齐规则的真正来源 每种数据类型有自己的对齐边界(alignment requirement): ``` 数据类型 自身大小 对齐边界 char 1字节 1字节对齐(任意地址都行) short 2字节 2字节对齐(地址必须是2的倍数) int/float 4字节 4字节对齐(地址必须是4的倍数) double/longlong 8字节 8字节对齐(地址必须是8的倍数) 指针(64位) 8字节 8字节对齐 ``` 举个例子: ```c struct Example { char a; // 放在地址 0 // a 占1字节,下一个可用地址是1 // 但 int b 要求4字节对齐,所以需要padding到地址4 // --- padding 3字节 --- int b; // 放在地址 4~7 // 下一个可用地址是8 // double c 要求8字节对齐,地址8刚好满足,不用padding double c; // 放在地址 8~15 }; ``` 这里 padding 是为了让 int b 放到4的倍数地址上,跟CPU块大小没关系。 CPU块大小影响什么? CPU的字长(如64位机器一次读8字节)主要影响: - 指针大小 — 64位机器指针是8字节 - long类型大小 — 64位Linux下long是8字节 - 结构体整体对齐 — 结构体总大小要是最大成员对齐值的倍数 但它不直接决定单个成员的padding。 一个反直觉的例子 ```c struct A { char a; // 1字节 double b; // 8字节 char c; // 1字节 }; ``` 在64位系统上: ``` | a | padding 7字节 | b (8字节) | c | padding 7字节 | ``` 总共24字节。 a 后面补7字节是因为 double b 需要8字节对齐,而不是因为CPU一次读8字节。 **总结** ``` 概念 决定因素 每个成员的对齐边界 数据类型自身的对齐要求(通常是类型大小的倍数) padding大小 让下一个成员满足对齐边界所需填补的字节数 结构体总大小 最大成员对齐值的倍数 CPU字长 影响指针、long等类型的大小,间接影响对齐 ``` 所以更准确的说法是:padding 由各成员的对齐边界要求决定,而各类型的对齐边界通常是该类型大小的倍数。
评论 0

发表评论 取消回复

Shift+Enter 换行  ·  Enter 发送
还没有评论,来发表第一条吧