1、内存对齐原因
- 平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。
- 性能原因:数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。
2、内存对齐后大小的计算(sizeof(int)=4,sizeof(char)=1,sizeof(float)=4,sizeof(double)=8)
- 针对结构体
#include <stdio.h> struct MyStruct { char da; double dda; int type[3]; }; int main(void) { int leng=sizeof(struct MyStruct); printf("%d",leng); return 0; }
结果为32;
解析:在结构体MyStruct中,基本类型长度最长的是double,为8个字节。所以以8个字节为标准进行对齐,则该结构体的变量所存储的位置应该为
.。。。。。。。(char)
........(double)
........(type[0]type[1])
....。。。。(type[2])
其中。是表示为了对齐所补上的字节。
如果结构体中的double类型改为int类型,即结构体中的数据类型最长的长度为4,则以4个字节为标准进行对齐,结果会变为20.
- 针对联合体
#include <stdio.h> union MyStruct { char da; double dda; int type[3]; }; int main(void) { int leng=sizeof(union MyStruct); printf("%d",leng); return 0; }
结果为16.
解析:在union中,变量共享内存,因为double类型长度最长,所以以8字节为标准,而union的大小就是最大的变量的长度。
int type[3]存放在内存的位置如下
........
....。。。。