数据对齐详解

您所在的位置:网站首页 数据融合的目的是什么 数据对齐详解

数据对齐详解

2024-07-15 02:58| 来源: 网络整理| 查看: 265

数据对齐实际上是内存字节的对齐,今天偶然翻开自己以前做的笔记,发现做了好多的题,但现在对于我来说觉得很陌生。上网查了一下数据对齐的原因和方式,现在把它整理出来以备之后的学习复习巩固。

转载请注出处:http://www.cnblogs.com/bakari/archive/2012/08/27/2658956.html

一、什么是数据对齐

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、数据对齐是为了读取数据的效率。假如说每一次 读取数据时都是一个字节一个字节读取,那就不需要对齐了,这跟读一个字节没有什 么区别,就是多读几次。但是这样读取数据效率不高。为了提高读取数据的带宽,现 代存储系统都采用许多并行的存储芯片来提高读取效率。

 

三、数据对齐的实现

通常,我们写程序的时候,不需要考虑对齐问题。编译器会替我们选择适合目标平台的对齐策略。当然,我们也可以通知给编译器传递预编译指令而改变对指定数据的对齐方法。

1、究竟数据在内存中是如何实现对齐的,对齐的细节以及对齐的方式编译器是如何展示的?请参考这篇文章,文章中说的很清楚:http://blog.csdn.net/arethe/article/details/2548867,本篇文章主要是通过一些典型的例子进行说明和巩固。

2、数据对齐的实现方式有两种,自然对齐(即默认对齐)和强制对齐

1)、自然对齐

       一般编译器如VS2003-VS2010,CB,DEV C++等编译器的对齐位,默认都是8位,即#pragma pack(value) value = 8。

看一个典型的例子

复制代码 1 #include 2 using namespace std; 3 4 struct A 5 { 6 char _iC1; 7 long _il; 8 char _iC2; 9 double _id; 10 }; 11 //打乱顺序 12 struct B 13 { 14 char _iC1; 15 char _iC2; 16 long _il; 17 double _id; 18 }; 19 int main(){ 20 cout


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3