如果您只是想在NUMA分配器周围获得对齐功能,您可以轻松构建自己的.
这个想法是用更多的空间调用未对齐的malloc().然后返回第一个对齐的地址.为了能够释放它,您需要将基地址存储在已知位置.
这是一个例子.只需用适当的名称替换名称:
pint // An unsigned integer that is large enough to store a pointer.
NUMA_malloc // The NUMA malloc function
NUMA_free // The NUMA free function
void* my_NUMA_malloc(size_t bytes,size_t align, /* NUMA parameters */ ){
// The NUMA malloc function
void *ptr = numa_malloc(
(size_t)(bytes + align + sizeof(pint)),
/* NUMA parameters */
);
if (ptr == NULL)
return NULL;
// Get aligned return address
pint *ret = (pint*)((((pint)ptr + sizeof(pint)) & ~(pint)(align - 1)) + align);
// Save the free pointer
ret[-1] = (pint)ptr;
return ret;
}
void my_NUMA_free(void *ptr){
if (ptr == NULL)
return;
// Get the free pointer
ptr = (void*)(((pint*)ptr)[-1]);
// The NUMA free function
numa_free(ptr);
}
要使用此功能,您需要为my_NUMA_malloc分配的任何内容调用my_NUMA_free.