字节对齐

现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定变量的时候经常在特定的内存地址访问,这就需要各类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。

各个硬件平台对存储空间的处理上有很大的不同。一些平台对某些特定类型的数据只能从某些特定地址开始存取。其他平台可能没有这种情况,但是最常见的是如果 不按照适合其平台要求对数据存放进行对齐,会在存取效率上带来损失。比如有些平台每次读都是从偶地址开始,如果一个int型(假设为32位系统)如果存放 在偶地址开始的地方,那么一个读周期就可以读出,而如果存放在奇地址开始的地方,就可能会需要2个读周期,并对两次读出的结果的高低字节进行拼凑才能得到 int数据。显然在读取效率上下降很多。这也是空间和时间的博弈。

我们先看一下不同变量所占的字节长度(32位系统):

 

      char 1 BYTE 1         int 4          double 8         long 4       short 2

      bool 1 BOOL 4         float 4 CString 4       void* 4

考查一个结构体

      struct TEST

      {

           char a;

           bool b;

           short c;

           int d;

      };

TEST内的字节长度直接计算为(char)+(bool)+(short)+(int)=8

sizeof(TEST)=8

似乎没有任何问题,可是把结构体内参数顺序改变一下

      struct TEST

      {

           char a;

           short c;

           int d;

           bool b;

      };

sizeof(TEST)=12

这就是字节对齐引起的,假设结构体开始的位置为0x0000(char)+(shor)=3不够对齐,所以(int)开始的地址为0x0004,而(bool)=1为了使整个结构体字节对齐,则后续的访问地址为0x 000c ,而不是0x0009,也就是说,bool占用了4个字节的空间以保证结构体的字节对齐;

 

如果对于系统来说,内存空间比较小,内存使用才是首先需要保证的,那么,可以用

      #pragma pack(value)

来设定对齐的长度,如上

      #pragma pack(1)

      struct TEST

      {

           char a;

           short c;

           int d;

           bool b;

      };

来设定对齐长度为1,则 sizeof(TEST)=8

 

字节对齐是对程序设计和优化时需要考虑的一个重要的方面,如果多个程序互相访问的时候,必须注意采用统一的字节对齐方式,来保证系统的正确运行。

 
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值