为了避免维护复杂的数据结构,我想分配具有相当大的对齐的块(比如几千字节,可能是兆字节,总是以2的幂)。这允许我屏蔽指针的低位,以便轻松检索它所指向的块的开头的地址。
我想要一种方法来保证分配具有指定对齐的这种块,例如。分配4096字节块与4096字节对齐。对于工作方法,对齐将始终是块的大小,因此从长远来看,预计内存浪费将成为一个问题。
我正在使用C ++(因此C和C ++技术很好),任何解决方案都应该可以在常见的桌面环境中移植。如果没有可移植的解决方案,Linux具有最高优先级。
我知道Win32 memory allocation with large alignment,但是如果有一个通用的C库通过一个函数调用来完成这个,我很乐意使用它。
背景:我正在试验所描述的Vlist结构there(最终目标是一种Scheme解释器),我目前正在为这些列表实现垃圾收集。我需要相当大的内存块作为垃圾收集器的竞技场。如果我改变GC技术,我仍然需要VList块具有32字节对齐(我在64位机器上执行我的实验)。
答案 0 :(得分:4)
我不知道完全可移植的解决方案。但_mm_malloc()
and _mm_free()
似乎是supported by ICC, GCC, and MSVC。
这是作为SSE内在函数的对齐内存支持的一部分添加的。
否则,你可以很容易地实现自己的:
void* my_malloc(size_t bytes,size_t align){
void *ptr = malloc(bytes + align + sizeof(intptr_t));
if (ptr == NULL)
return NULL;
// Get aligned return address
intptr_t *ret = (intptr_t*)((((intptr_t)ptr + sizeof(intptr_t)) & ~(intptr_t)(align - 1)) + align);
// Save the free pointer
ret[-1] = (intptr_t)ptr;
return ret;
}
void my_free(void *ptr){
if (ptr == NULL)
return;
// Get the free pointer
ptr = (void*)(((intptr_t*)ptr)[-1]);
free(ptr);
}
答案 1 :(得分:1)
Intel Thread Building Blocks有一个开源的跨平台可扩展内存分配器,支持对齐。
void* scalable_aligned_malloc(size_t size, size_t alignment);
答案 2 :(得分:1)
可以在不使用系统调用的情况下实现可移植的高效大对齐,在这种情况下,您可以在VirtualAlloc
和mmap
周围构建一个包装器,这将为您提供页面级别对齐,通常为64kb。
但是如果你只需要32个字节,只需从windows crt复制源对齐的malloc和free,它由标准的malloc支持,并且应该是完全可移植的(甚至更好的是glibc版本)。或者您可以查看自定义分配器,如nedmalloc