【发布时间】:2019-10-03 15:43:13
【问题描述】:
我过去曾设计过简单的固定块存储管理器 (SM) 和通用内存管理器。在这两种情况下,我都会在启动时分配一大块堆内存并一次又一次地重新使用释放的内存,从而防止频繁调用昂贵的 malloc/new 调用。
如果我谈论固定块 SM (Github link),那么我实际上已经看到了它带来的性能优势。在我的例子中,随机大小分配大约提高了 40%。
但对于通用内存管理器 (Github link)(没有内存池),我没有看到任何明显的性能提升。我能看到的唯一收获是访问内存使用统计信息。性能方面,由于确定空闲块(分配期间)和映射中的内存位置(释放期间)的开销,它会变得更慢。
所以我的问题是,自定义通用内存分配器在什么情况下会有用?值得付出努力吗?
【问题讨论】:
-
是的。如果您可以在内存管理器中平衡速度、简单性和可移植性,那么收益将远远超过工作。
-
malloc()和new()不是系统调用。像mmap和brk()这样的低级别的东西。 -
@JL2210 即便如此,由 C 或 C++ 代码进行的调用实际上是包装底层系统调用的 函数 调用,甚至不必调用 @ 987654328@ 或
brk()。例如,open()“系统调用”是一个可以包装openat()system call 的函数。我个人讨厌将库函数人为地和误导性地划分为“函数”和“系统调用”。 -
您是在询问该特定(相当天真,IMO)实现的潜在应用,还是一些为特殊目的设计的抽象自定义内存管理器的潜在应用?
-
@AndrewHenle 正确(虽然函数名称是
brk(),而不是break())。
标签: c++ c memory memory-management