c++ - 如何获得大对齐的 block ?

标签 c++ c memory-management

为了避免维护复杂的数据结构,我想分配具有相当大对齐方式的 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/

相关文章:

c++ - 如何创建 QList 的深拷贝 (Qt 4.8)

c++ - 为什么编译器不查看类的完整定义?

c - 基本 C Shell 实现 : Executing Commands

c++ - C++ 中是否存在内存泄漏 "undefined behavior"类问题?

c - 如何在基于 Linux 的嵌入式设备上造成内存碎片?

C# 代码没有调用它应该调用的 c++ dll 函数(它有一个类指针作为参数),我不应该更改 c++ 代码

c++ - 将文件映射到ram

java.lang.OutOfMemoryError : Java heap space in DBeaver 错误

c - atexit() 处的 Execv 注册问题

c++ - Arduino : Can import library in ino, 但不在 C++ 中