字节对齐提高执行效率

 

#include "stdafx.h"
#include <iostream.h>
#pragma pack(4)
struct A
{
 char a;
 int  b;
};
#pragma pack()

#pragma pack(1)
struct B
{
 char a;
 int  b;
};
#pragma pack()

int main(int argc, char* argv[])
{
 A a;
 cout<<sizeof(a);//8
 B b;
 cout<<sizeof(b);//5

 printf("Hello World!\n");
 return 0;
}

我们可以看到 A的对齐要比B浪费3个字节的存储空间.那为什么还要采取对齐呢? 

这是因为体系结构的对齐和不对齐,是在时间和空间上的一个权衡。

提高效率原理:

对齐:所有读写操作都是获取一个<=32位数据可以一次保证在数据总线传输完毕没有任何的额外消耗 
如:|1|2|3|4|5|6|7|8| 从1开始这里是a的起始位置,5起始为b的位置。访问的时候,如果访问a一次在总线传输8位其他24位无效的;访问b时则一次在总线上传输32完成。读写均是一次完整(读操作先要将读地址放到地址总线上,然后下个时钟周期再从外部存储器接口上读回数据,通过数据总线返回,需要两个周期 而写操作一次将地址及数据写入相应总线就完成了 读操作要比写操作慢一半 )

不对齐:|1|2|3|4|5|6|7|8|。此时a的地址没变还在1而因为是不对齐则b的位置就在2处。访问a时没问题还是读会一个字节
但是2处地址因为不是对齐。具体做法就是从1地址处先读回后三字节234 暂存起来.然后再由5地址处读回一个字节,将5 与234进行拼接组成一个完整的int再返回b.大家看看如此的操作带来的消耗多了不止三倍很明显在字长对齐时效率要高许多 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值