了解内存池

big*_*zer 4 c++ optimization performance memory-management memory-pool

据我所知,内存池是一个块,或者在运行时在堆栈上分配多个内存块.
相比之下,根据我的理解,从操作系统请求动态内存,然后在运行时分配在堆上.

//编辑//

  • 内存池显然不一定在堆栈上分配即.内存池可以与动态内存一起使用.
  • 非动态内存显然未必分配在栈上,按了这个问题的答案.
  • 因此,"动态与静态内存""内存池"的主题并不真正相关,尽管答案仍然相关.

据我所知,内存池的目的是提供RAM的手动管理,其中内存必须由程序员跟踪和重用.

出于多种原因,这在理论上对性能有利:

  1. 随着时间的推移,动态内存变得支离
  2. CPU可以比动态块更快地解析静态内存块
  3. 当程序员控制内存时,根据具体程序,他们可以选择在最好的情况下释放和重建数据.

4.多线程时,单独的池允许单独的线程独立运行而无需等待共享堆(Davislor)

我对内存池的理解是否正确?如果是这样,为什么看起来内存池不经常使用?

aut*_*tic 7

似乎这个问题阻碍了XY问题过早优化.

您应该专注于编写清晰的代码,然后使用分析器在必要时执行优化.

我对内存池的理解是否正确?

不完全的.

......在堆栈上......

......在堆上......

存储持续时间与池的概念正交; 可以将池分配为具有四个存储持续时间中的任何一个(它们是:静态,线程,自动和动态存储持续时间).

C++标准不要求任何这些进入堆栈 ; 考虑所有这些可能是有用的,就像它们进入同一个地方一样......毕竟,它们都(通常)都会进入硅芯片!

...在运行之前分配......

重要的是多个对象的分配发生首次使用这些对象之前(或至少不常见); 这节省了必须单独分配每个对象.我认为这是你在" 运行前"的意思.在选择分配的大小时,越接近任何给定时间所需的对象总数,过度分配所产生的浪费就越少,过度调整大小的浪费就越少.

但是,如果您的操作系统不是史前的,那么池的优势将会迅速减少.如果您在进行优化之前和之后使用了分析器,您可能会看到这一点!

  1. 随着时间的推移,动态内存变得支离

对于像Windows 1.0这样的天真操作系统,情况可能如此.然而,在这个时代,具有分配的存储持续时间的对象通常存储在虚拟存储器中,虚拟存储器周期性地被写入磁盘并从磁盘读回(这称为分页).因此,碎片化的内存可以进行碎片整理,更常用的对象,函数和方法甚至可能最终被合并到公共页面中.

也就是说,分页为您形成一个隐式(和缓存预测)!

CPU可以比动态块更快地解析静态内存块

虽然分配有静态存储持续时间的对象通常位于堆栈上,但C++标准并未强制要求这样做.完全可能的是,C++实现可能存在,其中静态的内存块在堆上分配,而不是.

对动态对象的缓存命中速度与静态对象上的缓存命中速度一样快.恰好,堆栈通常保存在缓存中; 你应该尝试在没有堆栈的情况下编程一段时间,你可能会发现缓存有更多的空间来!

在优化之前,您应始终使用分析器来衡量最重要的瓶颈!然后,您应该执行优化,然后再次运行探查器以确保优化成功!

这不是与机器无关的过程!您需要优化每个实现!一个实现的优化可能是对另一个实现悲观.

如果是这样,为什么看起来内存池不经常使用?

上面描述的虚拟存储器抽象结合消除使用高速缓存分析器的猜测工作实际上消除了除了最不知情(即使用分析器)场景之外的所有的有用性.