问题
为什么需要内存对齐
我的回答
内存对齐就是让数据的起始地址满足特定的对齐要求,通常是数据类型大小的整数倍。比如int类型(假设4字节)的变量,它的起始地址应该是4的倍数。
对齐规则一般是这样的:
基本数据类型的对齐值通常是其自身大小结构体的对齐值是其最大成员的对齐值结构体总大小是其对齐值的整数倍结构体第一个成员偏移量为0,之后的成员偏移量必须是自身对齐值的整数倍
举个例子:
struct Example {
char a; // 1字节
int b; // 4字节
short c; // 2字节
};
很多人以为这个结构体占7字节,但实际上会占12字节。因为char后面会填充3个字节让int对齐到4的倍数,short后面也会填充2个字节让整个结构体大小是4的倍数。
为什么需要对齐?主要有这几个原因:
硬件原因:CPU访问内存时,通常是按照字长(如4字节或8字节)来读取的。如果数据不对齐,可能需要两次内存访问才能读取一个数据。
效率问题:对齐的内存访问通常更快,有些处理器甚至不支持非对齐访问。
原子操作:某些原子操作要求数据必须对齐。