24

您如何分配与 C 中特定边界对齐的内存(例如,高速缓存行边界)?我正在寻找类似 malloc/free 的实现,它在理想情况下会尽可能地便携——至少在 32 位和 64 位架构之间。

编辑添加:换句话说,我正在寻找一些行为类似于(现在已经过时?)memalign函数,可以使用 free 释放。

4

3 回答 3

26

这是一个解决方案,它封装了对 malloc 的调用,为对齐目的分配了一个更大的缓冲区,并将原始分配的地址存储在对齐缓冲区之前以供以后调用 free。

// cache line
#define ALIGN 64

void *aligned_malloc(int size) {
    void *mem = malloc(size+ALIGN+sizeof(void*));
    void **ptr = (void**)((uintptr_t)(mem+ALIGN+sizeof(void*)) & ~(ALIGN-1));
    ptr[-1] = mem;
    return ptr;
}

void aligned_free(void *ptr) {
    free(((void**)ptr)[-1]);
}
于 2009-12-17T09:35:52.780 回答
14

使用posix_memalign/ free

int posix_memalign(void **memptr, size_t alignment, size_t size); 

void* ptr;
int rc = posix_memalign(&ptr, alignment, size);
...
free(ptr)

posix_memalign是一个标准的替代品memalign,正如你所提到的,它已经过时了。

于 2012-05-15T23:02:24.567 回答
4

你用的是什么编译器?如果您使用的是 MSVC,则可以尝试_aligned_malloc()使用_aligned_free().

于 2009-12-17T03:39:38.743 回答