内存竞技场和内存池有什么区别?

ide*_*n42 3 c malloc memory-management allocation

我已经看到用于内存分配器的包装器的两个术语,它们之间有什么区别?(如果有的话)

Mat*_*hew 5

内存领域和内存分配器有什么区别?

此页面上的最佳答案指出:

“内存领域”通常意味着从中分配较小块的大块(或块的集合)内存。“池”这个词也常用于这样的事情。

所以基本上:它们的意思相同,它们只是用于同一概念的不同术语。


Dan*_*l T 1

区别在于对象是否已初始化。

内存区域通常用于性能关键型或嵌入式通用 C 编程。它通常是静态分配char[]或内存映射的void *。您可以请求一段内存并将生成的 void 指针转换为您想要的任何类型。

内存池通常用于游戏开发中。为了获得最佳性能,它们具有 type MyObject[],并且在耗尽池对象时,人们会跳过池并从动态内存中分配/释放。其他人允许池通过使用链表来增长,这可能会更慢。池的要点在于它节省了初始化对象的工作量,这可能比初始化对象更复杂memset,例如用于包含指针的可变长度字符串的池。因此,内存池只是可供使用的单一类型的已初始化对象的集合。

内存分配器是这两种数据结构的补充。分配器是一个函数。使用分配器就像使用 getter 函数,而不是直接读取全局变量。标准库函数是一种通用分配器malloc。它可以以不同的方式实现,而无需消费者关心细节。例如,不同的 glibc/BSD/macOS libc 版本可能使用不同的混合brkmmap支持或数量的竞技场,Windows 使用另一种实现,并且某些应用程序选择使用 tcmalloc 或 jemalloc 替代内存分配器实现。

内存池和连接池之间的区别在于,内存池不包含任何套接字或文件打开的 IO 资源。然而,在 2012 年,并不是所有人都注意到了这四者之间的区别。2017 年,许多区别都是由 C++ 游戏开发社区做出的。从 2023 年开始,Linux Rust/C 互操作性工作正在做出一些区别。