许多固定长度的最快分配和解除分配?

Posted

技术标签:

【中文标题】许多固定长度的最快分配和解除分配?【英文标题】:Fastest allocating and deallocating of many fixed lengths? 【发布时间】:2021-12-20 21:25:01 【问题描述】:

我正在创建一种动态类型的编程语言,我需要解决如何为对象分配内存。每个对象的大小都是 8 的倍数,并且保证大于 16。我尝试过 malloc() 和 new,但它真的很慢。代码将在 1 个线程上运行。

基本上,我需要支持大小为 16、24、32、40、48、64、72、80、96 的对象,你懂的。

我尝试过使用 std::pmr::memory_resource 类,但我希望我能在性能方面做得更好。

我想到的一件事是维护一个固定大小分配器的向量,其中每个分配器处理 1 个大小,并且在请求时我转到那个分配器。

【问题讨论】:

您需要的是自定义堆分配器。分配一块内存,然后用你自己的分配逻辑对其进行二次分配。 谁在 C++ 中使用malloc? “但它很慢” 你是如何使用它的?什么是“慢”? 对。有没有我可以查看的参考实现,甚至只是它的理论?当然如果std lib/boost里面有类似的东西就更好了。 @sehe 我的意思是 new 运算符,当你重载 new 运算符时,它们会做同样的事情。 这里有一些开源堆例程:allocator 【参考方案1】:

如果您要处理的是对象,为什么不使用对象池 (https://en.wikipedia.org/wiki/Object_pool_pattern),也许是模板化的,这样您就可以为不同的对象类型使用不同的池。您应该能够以至少 1 GObjects/s 的速率保留/分配和释放/解除分配。

【讨论】:

非常感谢您的回答!不幸的是我听说它不会返回系统,我确实需要不时返回一点内存。

以上是关于许多固定长度的最快分配和解除分配?的主要内容,如果未能解决你的问题,请参考以下文章

最快的固定长度 6 int 数组

通过过度分配内存在结构中内联可变长度数组是不是有效?

数组的引用变量和内存分配

动态分配许多小块内存

分页机制和动态页面分配

固定长度的元组