是否有malloc实现在其自己的堆之外进行簿记?

3yE*_*3yE 6 c opengl embedded malloc

我需要管理一个内存堆,其约束条件是该内存只能写入,永远不会读取,即malloc实现应该将簿记信息与它管理的堆分开,在普通堆上,实际上应该永远不会触及它管理的特定堆.我希望使用经过测试,优化的现成解决方案,如果有的话.使用的示例包括OpenGL VBO和嵌入式系统的外部单元上的存储器.

我瞥了一眼dlmalloc,从文档中,它似乎标记了从双方分配记账信息的内存块.谷歌搜索也没有任何好处 - 也许我没有合适的关键字来找到我正在寻找的东西.

澄清:作为一个单独的堆,我的意思是我定义为堆.我想在一个或少量预分配的块中紧密使用具有小分配的内存.我甚至不关心簿记信息(在这样管理的堆之外)是否大于里面的数据:)此外,应用程序本身将使用stock malloc和heap进行操作,并且只将这些块用于特殊目的,归结为内存区域,用于与外部硬件通信,其中来自应用程序的写入是目的,读取是不可能的或昂贵的.这不是一般的malloc问题,我只是希望利用许多研究和测试已经进入的东西.

use*_*515 2

事实上,永远不应该触及它管理的特定堆。

如果它不管理堆怎么办?请参阅使用特定实现的 malloc 函数,该实现既不管理 [heap] 区域(参见/proc/$$/maps),也不将其元数据存储在可寻址内存中,但为您的程序提供了唯一的可寻址内存。

无效 *mymalloc(size_t len)
{
        void *x = mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
        返回 (x == (void *)-1) ?空:x;
}

现在,致命的启示是:glibc 正是使用它来实现足够大的分配。

  • glibc 不会(也不能)使用该方法进行大型分配,因为您的方法会丢弃映射的大小。因此以后不可能释放它。glibc 将大小存储在映射的开头,并返回指向超出该大小的内存的指针。 (2认同)