当今的计算机在计算机内存中读写数据时都是按字(word)大小块来进行操作的。

(在32位系统中,数据总线宽度为32,每次能读取4字节,地址总线宽度为32,因此最大的寻址空间为2^32=4GB,但是最低2位A[0],A[1]是不用于寻址,A[2-31]才能存储器相连,因此只能访问4的倍数地址空间,但是总的寻址空间还是2^30*字长=4GB,因此在内存中所有存放的基本类型数据的首地址的最低两位都是0,除结构体中的成员变量)。

基本类型数据对齐就是数据在内存中的偏移地址必须等于一个字的倍数,按这种存储数据的方式,可以提升系统在读取数据时的性能。

struct AlignData
{
char a;
short b;
int c;
char d;
};

1|padding 1| 2 | 4 | 1 | padding 3
编译后该结构体的大小为12个字节,最后一个成员d后面填充的字节数要使该结构体的总大小是其成员类型中拥有最大字节数的倍数(int拥有最大字节数),因此d后面要填充3个字节。

如果把struct AlignData的成员顺序调整成如下形式:
struct AlignData
{
char a;
char d;
short b;
int c;
};
那么编译后不用填充字节就能保持所有的成员都按各自默认的地址对齐。这样可以节约不少内存!一般的结构体成员按照默认对齐字节数递增或是递减的顺序排放,会使总的填充字节数最少。
大小为8.

参考链接:http://blog.csdn.net/donkeylong/article/details/4909720

标签: none

添加新评论