内存对齐
为什么需要内存对齐?
平台原因:不是所有的硬件平台都能访问任意内存地址上的任意数据,某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。为了同一个程序可以在多平台运行,需要内存对齐。
性能原因:内存对齐能够提高内存访问效率。CPU 在读取内存时,一次读取固定长度的数据(如4字节、8字节等)。如果将多个变量连续分配在内存中而不做对齐处理,会造成 CPU 读取数据出现“半包”的情况,此时,需要再进行一次内存访问才能获取该变量数据。
示例
在 32 位编译器(4字节对齐)中,以下结构的内存是如何分配的?
struct {
char a;
int b;
}st;
内存对齐的情况下,结构体 st 总共占 8 字节,其中 a 与 b 之间空余的 3 字节用于补齐缺少的字节(如果是 8 字节对齐,则需要补齐 8 字节)。
而在非内存对齐的情况下,仅占据 5 字节。
其在内存中的分布如下图所示:
可以发现,内存对齐会浪费一部分空间。事实也是如此,通常情况下,相对于空间,运行速度的提升更为重要。
在内存对齐的情况下,CPU 读取 int 类型的 b,仅需一次内存寻址即可完成。而对于非内存对齐,第一次寻址只能获得 b 的前 3 个字节数据,要获取完整的数据还需要再进行一次内存寻址,以获得第 4 个字节的数据。
这也是内存对齐能够提高效率的原因。
Reference
- https://blog.csdn.net/qq_43516928/article/details/119680760
- https://zhuanlan.zhihu.com/p/83449008