1.什么是内存对齐?
谈到这个问题,就要涉及到结构体大小如何计算的问题了。
1. struct s1 2. { 3. char a; 4. int b; 5. };
这个结构体占用多大内存呢?我们用函数sizeof()计算一下
printf("%d", sizeof(struct s1));
结果如下
为什么是8呢,char类型和int类型总大小不应该是5字节吗?这里就因为有内存对齐的存在,导致最终大小为8字节。下面详细介绍内存对齐。
2.内存对齐详解--
内存对齐有四条规则
1.结构体的第一个成员永远放在0偏移处.
2.其他成员要对齐到此成员对齐数 整数倍 的偏移处.此成员对齐数=编译器默认对齐数与成员自身大小的较小值.(vs默认对齐数是8)
3.结构体总大小必须是所有成员的对齐数中最大对齐数的整数倍.如果不是,则浪费空间补齐.
4.当结构体内部嵌套一个结构体,这个结构体的对齐数是这个结构体的内部成员最大对齐数,且结构体最终大小必须是所有对齐数中最大的对齐数(包含嵌套的结构体内部的对齐数)。
3.内存对齐的意义.
1.平台原因(移植原因)
A 不是所有的硬件平台都能访问任意地址上的任意数据的;
B 某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。
2.性能原因:
A 数据结构(尤其是栈)应该尽可能地在自然边界上对齐。
B 原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。