结构体对齐与填充
更新时间:2026-10-01。配合 内存对齐,本文聚焦结构体内部空洞及其性能/多核后果。
本文要回答的问题
- 为什么结构体常比字段之和大?
- packed 能省空间,为什么要小心?
一、对齐产生空洞
编译器要求基本类型按其自然边界对齐(如 int 4 字节),在成员间插入 padding。把大对齐成员放前面、按大小降序排可减少空洞;尾部还可能有尾填充。
二、packed 与行对齐
__attribute__((packed)) 去掉填充,但成员可能非对齐,访问变慢,在严格架构上直接异常,且影响跨平台/二进制兼容。热于多核的结构还要整体按缓存行对齐并在行尾填充,避免 false sharing。
三、常见坑
- 不看 sizeof/offsetof 假设布局。
- 随手 packed 引入非对齐访问。
- 多核共享小结构不按行隔离。
小结
对齐填充保证高效访问,重排成员可减空洞;packed 省空间却有非对齐代价,热结构要按行对齐。下一篇 流式数据处理与绕过缓存。
总结
编译器为让基本类型自然对齐会在结构体成员间插入 padding,所以结构体常比字段之和大——按对齐从大到小重排成员可减少空洞;packed 虽能省掉填充,却让成员非对齐,访问变慢、在严格架构上直接异常且不可移植,而被多核高频写的热结构还要整体按缓存行对齐、在行尾填充以避免伪共享,布局是否如预期一律用 sizeof/offsetof 验证。