如何获得大对齐的块?

Ale*_* C. 9 c c++ memory-management

为了避免维护复杂的数据结构,我想分配具有相当大的对齐的块(比如几千字节,可能是兆字节,总是以2的幂).这允许我屏蔽指针的低位,以便轻松检索它指向的块的开头的地址.

我想要一种方法来保证分配具有指定对齐的这种块,例如.分配4096字节块与4096字节对齐.对于工作方法,对齐将始终是块的大小,因此从长远来看,预计内存浪费将成为一个问题.

我正在使用C++(因此C和C++技术很好),任何解决方案都应该可以在常见的桌面环境中移植.如果没有可移植的解决方案,Linux具有最高优先级.

我知道具有大对齐Win32内存分配,但如果有一个通用的C库通过一个函数调用来执行此操作,我很乐意使用它.

背景:我正在尝试那里描述的Vlist结构(最终目标是一种Scheme解释器),我正在为这些列表实现垃圾收集.我需要相当大的内存块作为垃圾收集器的竞技场.如果我改变GC技术,我仍然需要VList块具有32字节对齐(我在64位机器上执行我的实验).

Mys*_*ial 5

我不知道完全便携式的解决方案。但_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)