数据对齐的作用(于ALIGN密切相关)

来源:互联网 发布:sql 别名 空格 编辑:程序博客网 时间:2024/03/29 10:00


首先由结构体的大小计算方式可以引出这个问题。在过去的学习当中我们可以知道,一个结构体的大小就是其成员变量大小之和。然而在编译器中利用sizeof一个结构体变量时你会发现,结构体的大小往往大于预期。

这是为什么。因为编译器在这些成员变量中插入了一些值,使得这些变量在内存中以一个特殊的规则排列,这叫做内存对齐。由于编译器的优化,往往会忽略这一点。
内存对齐实际上是编译器为了提高程序在执行时的运行效率而实现的一种优化方法。在32位架构的计算机中,CPU跟内存通过32位的数据线进行数据的传输,也就是说为了得到内存中某一地址的内容,内存和CPU之间要传输4字节的内容。即使是CPU读取或者写入,也是如此,无非是选出所要的一个内存单元上的数据。因此当一个4字节的内容放在起始地址非4整除的位置上的时候,CPU必须读取两次内存单元上的内容并把选出需要的位置上的数据。内存对齐就是将数据移动到相邻的首地址是4的倍数的位置(除了小于4byte的数据),从而以编译损失的代价来换取运行时候的高效的数据读写效率

出自王爽汇编的一道题目
对于如下定义的段:
   name segment
   ....
   name ends
如果段中的数据占N个字节,则程序加载后,该段实际占有的空间为_____.
答案:
        (N/16+1)*16(字节) [说明:N/16只取整数部分]    或   (N+15)/ 16(节) ,对16取整
       在8086CPU架构上,段是以paragraph(16-byte)对齐的。程序默认以16字节为边界对齐,所以不足16字节的部分数据也要填够16字节。“对齐”是alignment,这种填充叫做padding。16字节成一小段,称为节