为什么需要对齐
CPU读取内存粒度一般是2,4,8,16字节,当CPU读取非对齐内存时,有可能需要两次访问,而对齐内存只需要一次。
假设下面的结构体是按1字节对齐,CPU读取内存粒度为4,那么当访问数据成员c时,CPU需要先读取前4个字节的内容,然后再读取后4字节的内容。
struct TestStruct
{
char a;
short b;
short c;
};
不是所有的硬件平台都能访问任意地址上的任意数据的,某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。Intel/AMD的x86/x86-64架构则始终支持支持非对齐内存访问,而在ARM架构中,只有ARMv6及以上才支持非对齐内存访问。
结构体对齐规则
每个数据成员的偏移量必须是数据成员自身长度和指定的对齐长度中较小的那个的倍数。
结构体大小必须是结构体中最大数据成员长度和指定的对齐长度中较小的那个的倍数。
网友评论