PS:这篇博客写得很详细,下面的学习笔记都是参考其完成
https://blog.csdn.net/markl22222/article/details/38051483
一、内存对齐 Data structure alignment
PS:WiKi 的定义很清楚,内存对齐就是数据在电脑中的存储方式
Data structure alignment refers to the way data is arranged and accessed in computer memory.
It consists of three separate but related issues:
- data alignment
- data structure padding
- packing
1. 内存对齐(Data structure alignment)
是一个数据类型所存放的内存地址的属性,这个属性是一个无符号整数,并且这个整数必须是2的N次方 1、2、4、8、……
比如,一个数据类型的内存对齐为8,是指这个数据类型定义出来的所有变量,其内存地址都是8的倍数
2. 自然对齐(naturally aligned)
基本数据类型的对齐属性,和这个数据类型的大小相等时,这种对齐方式称作自然对齐
比如,一个4字节大小的int型数据,默认情况下它的内存对齐也是4
二、为什么要用内存对齐?
考虑到CPU处理内存的方式
32位的x86 CPU,一个时钟周期可以读取4个连续的内存单元,即4字节,使用字节对齐将会提高系统的性能,也就是CPU读取内存数据的效率。
比如,一个int放在奇数内存位置上,将4个字节读出,32位CPU就需要两次,但对齐之后一次就可以。
三、数据填充 Data Structure Padding
内存对齐可能会让数据在内存里的存放不是紧挨着的,而是可能会出现一些空隙
举个例子:
1.定义一个结构体,如果直接相加占用内存是16,sizeof 的结果其实更大,这是因为,为了保证这个结构体里的每个成员都应该在它对齐的内存位置上,而在某些位置插入了Padding
1 | struct MyStruct { |
2.填充后的结果
当然,不同平台下会使用不同的默认对齐值,下面这个只是一种方式
1 | struct MyStruct { |
3.结构体类型本身的内存对齐
为了保证结构体内的每个成员都能够放在它自然对齐的位置上,对这个结构体本身来说最理想的内存对齐数值应该是结构体里内存对齐数值最大的成员的内存对齐数