数据对齐

一、什么是数据对齐

在当今计算机中,内存空间的划分都是按字节进行的。理论上,任何的数据类型的变量的访问可以从任意的地址开始,然而实际上在访问特定类型的变量时经常在特定的地址空间进行。各类型的数据在内存空间上按一定的规则进行排列而不是一个紧接一个排列,这就是所谓的数据对齐。


二、访问数据地址

访问数据的地址应满足一定的条件:能被该数据的长度所整除。

例如:2字节的数据的地址应满足被2整除;4字节的数据的地址应满足被4整除。


三、对齐的目的

(1)平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取得某些特定类型的数据,否则抛出硬件异常。比如有些平台每次读都是从偶地址开始,如果一个int型存放在偶地址开始位置,则一个读周期就可以读取该数据;如果存放在奇地址开始的位置则需要两个读周期才能读完该数据。

(2)性能原因:经过内存对齐后,CPU的内存访速度大大提升。

数据对齐占用内存举例

#include<stdio.h>

struct temp1
{
      char c1;
      char c2;
      int a;
      float b;

};

上面的例子中,c1占1个字节,c2也占1个字节,int型占2个字节,在存储c1、c2后开始的地址正好使a对齐。float占4个字节,存储完a后开始的地址也正好使b对齐。故sizeof(temp1) = 1+1+2+4 = 8个字节

#include<stdio.h>

struct temp2
{
      char c1;
      int a;
      char c2;
      float b;
};

 上面的例子,c1占1个字节,int型占两个字节,为了使后面的int型数据对齐,需要增加1个字节,float型占4个字节,为了使其自然对齐,c2后应增加个3字节,故sizeof(temp2) = 1+1+2+1+3+4 = 12个字节 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值