Ale*_* C. 9 c c++ memory-management
为了避免维护复杂的数据结构,我想分配具有相当大的对齐的块(比如几千字节,可能是兆字节,总是以2的幂).这允许我屏蔽指针的低位,以便轻松检索它指向的块的开头的地址.
我想要一种方法来保证分配具有指定对齐的这种块,例如.分配4096字节块与4096字节对齐.对于工作方法,对齐将始终是块的大小,因此从长远来看,预计内存浪费将成为一个问题.
我正在使用C++(因此C和C++技术很好),任何解决方案都应该可以在常见的桌面环境中移植.如果没有可移植的解决方案,Linux具有最高优先级.
我知道具有大对齐的Win32内存分配,但如果有一个通用的C库通过一个函数调用来执行此操作,我很乐意使用它.
背景:我正在尝试那里描述的Vlist结构(最终目标是一种Scheme解释器),我正在为这些列表实现垃圾收集.我需要相当大的内存块作为垃圾收集器的竞技场.如果我改变GC技术,我仍然需要VList块具有32字节对齐(我在64位机器上执行我的实验).
我不知道完全便携式的解决方案。但_mm_malloc()似乎_mm_free()得到了ICC、GCC 和 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);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
776 次 |
| 最近记录: |