为了避免维护复杂的数据结构,我想分配具有相当大对齐方式的 block (比如几千字节,可能是几兆字节,总是以二的幂为单位)。这允许我屏蔽指针的低位,以便轻松检索它指向的 block 的开头地址。
我想要一种方法来保证分配这样一个具有指定对齐方式的 block ,例如。分配具有 4096 字节对齐的 4096 字节 block 。对于有效的方法,对齐将始终是 block 的大小,因此从长远来看,内存浪费预计将成为一个问题。
我使用的是 C++(因此 C 和 C++ 技术很好),任何解决方案都应该可以跨通用桌面环境移植。如果没有可移植的解决方案,Linux 具有最高优先级。
我知道 Win32 memory allocation with large alignment ,但是如果有一个通用的 C 库可以通过一个函数调用来执行此操作,我会很乐意使用它。
背景:我正在试验 there 中描述的 Vlist 结构(最终目标是一种 Scheme 解释器),我目前正在为这些列表实现垃圾收集。我需要相当大的内存块作为垃圾收集器的场所。如果我更改 GC 技术,我仍然需要 VList block 具有 32 字节对齐(我正在 64 位机器上执行我的实验)。
最佳答案
我不知道有完全便携的解决方案。但是_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);
}
关于c++ - 如何获得大对齐的 block ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8862718/