内存对齐问题

来源:互联网 发布:淘宝高级搜索在哪里 编辑:程序博客网 时间:2024/06/02 00:27

基本上每次笔试都有这种题,看了博客,感觉都写的乱七八糟的。

比如32位吧,对齐的内存为4字节,

这就意味着总线一次只能读取四个字节的数据,

比如有个内存abcd  efgh hijk  lmno

每个字母代表一个字节,

定义一个struct

struct S{

char  x;

int y;

short z;

};

sizeof(S)==12;

内存占用分布是x占了a,y占了从h到k,z占lm。

为什么呢,因为总线一次只能从4的整数倍地址开始寻址,一次读取4个字节。

如果是x占了a,y占了从b到e,那么cpu想要得到y的值需要读取内存两次,分别读取abcd和efgh,然后将bcd和e拼凑到一起变成y的值。

IO是非常费时间的,所以一般会有对齐,这样一来,读取b的值只需要读取一次就行。

再看。

struct T{

char  xx;

char   x;

int  y;

short z;

};

同样sizeof(T)==12;

为什么。

因为char占一个字节,所以xx和x分别占用了a和b内存。

而每次读取xx或者x的时候都只需要一次读取abcd内存的值,然后选择a或者b就行。



0 0