在跨平台的编程语言中存在内存对齐,Java、Python都是一样的
为什么会有内存对齐:
1、平台原因:不是所有的硬件平台都能访问任意内存地址上的数据,某些平台只能在一些地址处获取特定类型的数据,否则抛出硬件异常。为了使同一个程序可以在多平台运行,需要进行内存对齐
2、硬件原因:经过内存对齐后,CPU访问内存的速度会大大提升
CPU读取内存时不是一次读取单个字节,而是按照块来读取的,块的大小可以是2、4、8、16字节,具体读取多少字节取决于硬件。
假设CPU把内存划分为4字节大小的块,要读取一份4字节大小的int型数据,有如下两种方式:
一、内存对齐的情况
图1
1字节的char占用了4字节的内存空间,空了3字节的内存地址,int数据从地址4开始。此时直接读取地址4、5、6、7处的4字节数据即可(如图1)
二、非内存对齐的情况
图2
char型数据和int型数据挨在一起,该int型数据从地址1开始,CPU读取这个数据需要如下几步操作:
1、CPU读取0、1、2、3处的4字节的数据
2、CPU读取4、5、6、7处的4字节的数据
3、合并地址1、2、3、4处后的4字节的数据才是本次操作需要的int型数据
此时一共需要两次寻址、一次合并的操作。
通过对比发现内存地址速度块,但是浪费了内存资源
但是实际上,计算机的内存资源一般都是充足的,代码更希望提高计算机的运行速度。
编译器都会做内存对齐的操作(当考虑程序正在占用的内存大小的时候,也需要认识到内存对齐的影响)