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

问题描述 投票:0回答:3

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

c memory-management malloc allocation
3个回答
9
投票

内存竞技场和内存分配器有什么区别?

本页的最佳答案指出:

“内存区域”通常指的是一大块内存(或内存块的集合),从中分配较小的内存块。 “池”这个词也常用于这样的事情。

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


1
投票

区域内存管理内存插槽有时称为“arena”,有时称为“pool”。 “池”不仅用于本机代码 C/C++ 中的本机原始内存管理,而且还用于 JVM 中以保持热内存并最大限度地减少 GC 暂停的延迟影响。

它不再一样了,“对象池”不应该被称为“竞技场”,因为 Rust 也采用了 - https://manishearth.github.io/blog/2021/03/15/arenas-in-rust/ 以避免混乱。


0
投票

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

内存区域通常用于性能关键型或嵌入式通用 C 编程。它通常是静态分配的

char[]
或内存映射的
void *
。您可以请求一段内存并将生成的 void 指针转换为您想要的whatever类型。

内存池通常用于游戏开发中。为了获得最佳性能,它们具有类型

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

内存分配器是这两种数据结构的补充。分配器是一个函数。使用分配器就像使用 getter 函数,而不是直接读取全局变量。一种通用分配器是

malloc
标准库函数。它可以以不同的方式实现,而无需消费者关心细节。例如,不同的 glibc/BSD/macOS libc 版本可能使用不同的
brk
mmap
支持或竞技场数量的组合,Windows 使用另一种实现,并且某些应用程序选择使用 tcmalloc 或 jemalloc 替代内存分配器实现。

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

© www.soinside.com 2019 - 2024. All rights reserved.