什么是内存对齐?
内存对齐:是计算机对数据类型合法地址做出了一些限制,要求某种类型对象的地址必须是某个值K(通常使2、4、8、16、32或64)的倍数。
为什么需要内存对齐?
- 不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。
- 对于未对齐的内存,处理器可能需要访问两次内存才能将数据完全读出,而对于对齐的内存,处理器只需要一次即可。
内存对齐规则?
可以通过预编译命令#pragma pack(n
)来指定有效对齐值。
注意:并不是说n就是有效对齐值,可以理解为建议以n为有效对齐值,实际有效对齐值还要根据结构体成员大小来决定,如果n的值比结构体数据成员的大小**小**才起作用。
-
结构体数据成员对齐规则:第一个成员放在offet(偏移量)为0的地方,以后每个数据成员的offset按照该成员的大小和有效对齐值中较小的整数倍,即
有效对齐值=min(数据成员类型大小,n) offset=有效对齐值∗整数倍
-
结构体对齐规则:在数据成员对齐后,结构体本身也要对齐,其总大小为有效对齐值的整数倍,即
有效对齐值=min(数据成员类型大小,n) offset=有效对齐值∗整数倍
-
结构体作为数据成员:对于数据成员是结构体的情况,则该结构体成员要从其内部最大数据成员大小的整数倍地址开始存储