资料合集下载链接:
https://pan.quark.cn/s/472bbdfcd014
大家好!今天我们来聊一个C/C++程序员绕不开的话题——内存对齐(Memory Alignment)。你是否曾好奇,为什么一个包含char(1字节)和int(4字节)的结构体,它的大小(sizeof)结果往往不是 1+4=5 字节,而是8字节?这背后的“黑魔法”就是内存对齐。
一、 什么是内存对齐?为什么需要它?
内存对齐是为了提高CPU访问内存的效率。
想象一下,CPU是一位勤劳的搬运工,但它不喜欢一个一个地搬运货物(字节),而是喜欢用小推车(比如4字节或8字节的“字长”)一次性搬运一整块。
• 未对齐的情况: 如果一个4字节的int数据,它的起始地址不是4的倍数,比如从地址1开始,跨越到了地址4。那么CPU的“小推车”第一次只能拉走地址0-3的数据,第二次再拉走地址4-7的数据,然后把两部分需要的数据拼接起来,才能得到完整的int值。这无疑降低了效率。
• 对齐的情况: 如果这个int数据存放在地址4,这是一个4的倍数。CPU的小推车一次就能把地址4-7的数据完整拉走,一步到位,效率极高。
所以,内存对齐的本质是**“以空间换时间”**。编译器通过在数据之间填充一些空白字节(Padding),确保每个数据成员都存放在一个“舒服”的地址上,从而让CPU能够高效地进行块状读取。
二、 内存对齐的核心三原则
要精确计算一个结构体的大小,我们必须掌握其内存对齐的三条黄金法则。
1. 首成员对齐: 结构体的第一个成员,其起始地址(偏移量)为0。
2. 成员偏移量对齐: 从第二个成员开始,每个成员的起始地址必须是 其自身对齐要求 的整数倍。
3. 结构体总大小对齐: 结构体的总大小,必须是其 所有成员中最大对齐要求 的整数倍。
什么是“对齐要求”?
• 对于基本数据类型,其对齐要求通常就是它自身的大小(





















暂无评论内容