c++在很多地方都采用了对其分配内存的方式,比如一个类对象数据成员的存放就按照对齐方式存放。对齐有利于存取效率的提高:比如有些平台每次读取数据都是从偶数地址开始,若一个int型存放在偶数地址开始处,则一次读周期就可以读出这个整数,而如果存放在奇数地址处,则需要两个读周期。标准库提供的malloc和free并没有对齐的要求,需要的时候,我们可以自己实现一个对齐分配的malloc和free。
分配内存的时候需要多分配一些空间用以调整指针的开头,使得指针的地址是对齐的。同时注意要在对齐指针的前面“额外”的空间中存放malloc实际分配得到的地址,等下释放内存空间的时候需要用此地址来释放。而且必须同时编写自己的内存释放函数,如果将对齐的地址直接传给标准的free()函数,将出现不确定的行为。
void* aligned_malloc(size_t required_bytes, size_t alignment){ void* p1; void** p2; int offset = alignment - 1 + sizeof(void*); if ((p1 = (void*)malloc(required_bytes + offset)) == NULL){ return NULL; } p2 = (void**)(((size_t)(p1)+offset) & ~(alignment - 1)); p2[-1] = p1; return p2; } void aligned_free(void *p2){ void* p1 = ((void**)p2)[-1]; free(p1); }