许多固定长度的最快分配和解除分配?
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 的速率保留/分配和释放/解除分配。
【讨论】:
非常感谢您的回答!不幸的是我听说它不会返回系统,我确实需要不时返回一点内存。以上是关于许多固定长度的最快分配和解除分配?的主要内容,如果未能解决你的问题,请参考以下文章