#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.大家看看如此的操作带来的消耗多了不止三倍很明显在字长对齐时效率要高许多