C语言:内存对齐

内存对齐(硬件寄存器设计的要求)
*//1.前面所有成员字节数相加是当前成员的字节数的倍数,不是则补齐
*//2.整个结构体得大小要能整除最大单个成员的字节数

C语言:内存对齐_第1张图片

例子:

1.

C语言:内存对齐_第2张图片

2.

C语言:内存对齐_第3张图片

显然程序1 输出的结果为 8    2 输出的结果为 16 .

1.最大的数据成员是4bytes,1+4=5,补齐为4的倍数,也就是8。而2为8bytes,1+8=9,补齐为8的倍数,也就是16。

3.

C语言:内存对齐_第4张图片

4.

C语言:内存对齐_第5张图片

3运行结果为 12  4运行结果为 8

char为1个字节 ,int为4个字节, 根据两个规则:

class中的数据成员放入内存的时候,内存拿出一个内存块来,数据成员们排队一个一个往里放,遇到太大的,不是把自己劈成两半,能放多少放多少,而是等下一个内存块过来。这样的话,就可以理解为什么No.3,No.4两端的代码输出结果不一样了,因为左边是1+(3)+4+1+(3)=12,而右边是1+1+(2)+4=8。括号中为补齐的bytes。

5.

C语言:内存对齐_第6张图片

6.

C语言:内存对齐_第7张图片

5和6运行结果均为: 48

在默认条件下,内存对齐是以class中最大的那个基本类型为基准的,如果class中有自定义类型,则递归的取其中最大的基本类型来参与比较。在No.5和No.6中内存块一个接一个的过来接走数据成员,一直到第5块的时候,BigData里只剩1个char了,将它放入内存块中,内存块还剩7个bytes,接下来是个int(4bytes),能够放下,所以也进入第5个内存块,这时候内存块还剩3bytes,而接下来是个double(8bytes),放不下,所以要等下一个内存快到来。因此,No.5的Data的size=33+4+(3)+8=48,同理No.6应该是33+(7)+8=48。

内存对齐的主要作用是:

1、  平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。

2、  性能原因:经过内存对齐后,CPU的内存访问速度大大提升。具体原因稍后解释

 

 

你可能感兴趣的:(c语言)