目录
内存地址为什么需要对齐?
例如int a的地址是0x00fffff3,则其字节分布在0x00fffff3~0x00fffff6空间内,为了读取这个int,cpu必须对0x00fffff0和0x00fffff4进行两次内存读取,并处理得出的中间结果。两次内存访问将会浪费大量的时间,因为内存访问的速度远小于CPU处理指令的速度。
比如计算一个结构体的大小
struct example{
char a;
short b;
int c;
float d;
double e;
};
在计算结构体大小 sizeof(struct example)的时候,其大小值并不是成员大小相加,而是比他们更大,因为cpu自动进行地址对齐操作。
但是如果要在堆空间中申请一块空间,需要一个用函数posix_memalign替换malloc
posix_memalign
int posix_memalign (void **memptr,
size_t alignment,
size_t size);
memptr 分配空间的首地址
alignment 按照多大字节对齐
size 需要分配的空间的大小
alignment 必须大于2 且尽量2 的倍数
开源库中字节对齐的方法
#define mp_align_ptr(p, alignment) (void *)((((size_t)p)+(alignment-1)) & ~(alignment-1))
这个方法 以前看开源代码的时候看到的字节对齐方法。
其作用是将地址p 向上取整到大于p的最小alignment倍数,通常alignment是4的倍数