【发布时间】:2017-05-30 04:52:53
【问题描述】:
据我了解,内存池是一个块,或者是运行前在堆栈上分配的多个内存块。
相比之下,据我了解,动态内存是从操作系统请求的,然后在运行时分配到堆上。
// 编辑 //
- 内存池显然不一定在堆栈上分配,即。内存池可以与动态内存一起使用。
- 根据这个问题的答案,显然也不一定在堆栈上分配非动态内存。
- “动态与静态内存”和“内存池”的主题虽然答案仍然相关,但实际上并不相关。 李>
据我所知,内存池的目的是提供对 RAM 的手动管理,其中内存必须由程序员跟踪和重用。
这在理论上有利于性能,原因有很多:
- 随着时间的推移动态内存变得碎片化
- CPU 解析静态内存块的速度比动态块快
- 当程序员可以控制内存时,他们可以根据具体的程序选择在最好的时候释放和重建数据。
4、多线程时,分离池允许不同线程独立运行,无需等待共享堆(Davislor)
我对内存池的理解正确吗?如果是这样,为什么似乎不经常使用内存池?
【问题讨论】:
-
您可能需要单独的内存池的一个原因是,如果您有多个线程同时分配和释放内存。如果它们都使用同一个堆,则它们必须等待其他线程完成对堆的修改才能继续。如果每个线程都有自己的内存池,它可以使用它而无需任何锁定或等待。
-
“CPU 可以解析静态内存块...” - 这完全是不是 CPU 的工作方式。事实上,典型的 CPU 不知道程序中存在哪些类型的内存——他们甚至不知道程序是用什么语言编写的!
-
@davislor 这也是一个好点,我稍后会在问题中编辑它。
-
@msalters 也许我应该将“解析”一词更改为“访问”。我被告知的是 CPU 实际上可以更快地循环通过静态内存。也许是因为它被打包得更紧/更有可能对齐,因此缓存未命中率更低?
-
@davislor 问题已编辑,添加了关于线程的部分
标签: c++ performance optimization memory-management memory-pool