数据对齐
C语言术语
在C语言中,对齐是内存数据与内存中的相对位置的问题。如果一个变量的内存地址正好是它长度的整数倍,它就被称作是自然对齐的。
对于一个32位(4个字节)类型的数据,如果它在内存中的地址刚好可以被4整除(最低位两位是0),那它就是自然对齐的。
一些体系结构对对齐的要求非常严格,通常是基于RISC的系统载入末对齐的数据会导至处理器陷入一种可处理的错误,还有一些系统可以访问没有对齐的数据,但性能会下降。编写可移植性高的代码要避免对齐问题,保证所有的类型都能够自然对齐
一、什么是数据对齐
1、现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定变量的时候经常在特定的内存地址访问,这就需要各类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。
2、访问数据的地址要满足一定的条件,能被这个数据的长度所整除。 例如,1字节数据已经是对齐的,2字节的数据的地址要被2整除,4字节的数据地址要 被4整除。
3、数据对齐并不是操作系统的内存结构的一部分,而是C P U结构的一部分。
4、 当C P U访问正确对齐的数据时,它的运行效率最高。当数据大小的数据模数的内存地址是0时,数据是对齐的。例如, W O R D值应该总是从被2除尽的地址开始,而D W O R D值应该总是从被4除尽的地址开始,如此等等。当C P U试图读取的数据值没有正确对齐时, C P U可以执行两种操作之一。即它可以产生一个异常条件,也可以执行多次对齐的内存访问,以便读取完整的未对齐数据值。
二、对齐的原因
1、 各个硬件平台对存储空间的处理上有很大的不同。一些平台对某些特定类型的数据只能从某些特定地址开始存取。其他平台可能没有这种情况, 但是最常见的是如果不按照适合其平台的要求对数据存放进行对齐,会在存取效率上带来损失。比如有些平台每次读都是从偶地址开始,如果一个int型(假设为 32位)如果存放在偶地址开始的地方,那么一个读周期就可以读出,而如果存放在奇地址开始的地方,就可能会需要2个读周期,并对两次读出的结果的高低 字节进行拼凑才能得到该int数据。显然在读取效率上下降很多。这也是空间和时间的博弈。
2、数据对齐是为了读取数据的效率。假如说每一次 读取数据时都是一个字节一个字节读取,那就不需要对齐了,这跟读一个字节没有什 么区别,就是多读几次。但是这样读取数据效率不高。为了提高读取数据的带宽,现 代存储系统都采用许多并行的存储芯片来提高读取效率。
参考资料
数据对齐详解.凭海临风.2012-8
最新修订时间:2021-09-24 19:43
目录
概述
参考资料