如何获得大对齐的块?

时间:2012-01-14 14:11:34

标签: c++ c memory-management

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

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

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

我知道Win32 memory allocation with large alignment,但是如果有一个通用的C库通过一个函数调用来完成这个,我很乐意使用它。

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

3 个答案:

答案 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)

可以在不使用系统调用的情况下实现可移植的高效大对齐,在这种情况下,您可以在VirtualAllocmmap周围构建一个包装器,这将为您提供页面级别对齐,通常为64kb。

但是如果你只需要32个字节,只需从windows crt复制源对齐的malloc和free,它由标准的malloc支持,并且应该是完全可移植的(甚至更好的是glibc版本)。或者您可以查看自定义分配器,如nedmalloc