内存对齐

在跨平台的编程语言中存在内存对齐,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型数据

此时一共需要两次寻址、一次合并的操作。


通过对比发现内存地址速度块,但是浪费了内存资源

但是实际上,计算机的内存资源一般都是充足的,代码更希望提高计算机的运行速度。

编译器都会做内存对齐的操作(当考虑程序正在占用的内存大小的时候,也需要认识到内存对齐的影响)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。