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

//编辑//

  • 显然不必在堆栈上分配内存池,即。内存池可以与动态内存一起使用。
  • 根据此问题的答案,显然也不必在堆栈上分配非动态内存。
  • 尽管答案仍然很重要,但“动态与静态内存”和“内存池”的主题并没有真正相关。

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

    理论上,出于多种原因,这对于性能而言是有利的:
  • 动态内存随着时间的流逝变得碎片化
  • CPU可以比动态块
  • 更快地解析静态内存块
  • 当程序员可以控制内存时,他们可以根据特定程序选择释放并重建数据,最好是这样做。

  • 4.在多线程中,单独的池允许单独的线程独立运行,而不必等待共享堆(Davislor)

    我对内存池的理解正确吗?如果是这样,为什么似乎不经常使用内存池?

    最佳答案

    似乎这个问题与XY problempremature optimisation并存。
    您应该专注于编写清晰的代码,然后在必要时使用探查器进行优化。

    不完全的。

    存储期限与池的概念正交。可以将池分配为具有四个存储持续时间中的任意一个(它们是:静态,线程,自动和动态存储持续时间)。
    C++标准不要求其中任何一个都放入堆栈或堆中。考虑所有它们,就像它们都进入同一个地方一样可能很有用...毕竟,它们都(通常)都放在硅芯片上!

    重要的是,多个对象的分配发生在(或者至少少于)第一次使用这些对象之前;这样省去了分别分配每个对象的麻烦。我认为这就是您所说的“运行前”。选择分配的大小时,在任何给定时间,您越接近所需的对象总数,则过多分配所产生的浪费就越少,而调整大小所带来的浪费就越少。
    但是,如果您的操作系统不是史前版本,则池的优势将 swift 消失。如果在进行优化之前和之后使用了探查器,您可能会看到此信息!

    这对于诸如Windows 1.0这样的天真的操作系统可能是正确的。但是,在当今时代,具有分配的存储持续时间的对象通常存储在虚拟内存中,该虚拟内存会定期写入磁盘并从磁盘读回(这称为分页)。结果,可以对碎片化的内存进行碎片整理,而更常用的对象,功能和方法甚至可能最终被合并为通用页面。
    也就是说,分页为您形成了一个隐式池(和缓存预测)!

    尽管分配有静态存储持续时间的对象通常位于堆栈上,但C++标准并未对此进行规定。完全有可能存在C++实现,而是在堆上分配静态内存块。
    对动态对象的缓存命中将与对静态对象的缓存命中一样快。 发生这种情况的原因是堆栈通常保存在缓存中。您应该尝试在没有堆栈的情况下进行一些编程,并且可能会发现缓存有更多的空间供堆使用!
    在优化之前,应始终使用分析器来测量最重要的瓶颈! 然后,您应该执行优化,然后再次运行探查器,以确保优化成功!
    这不是独立于机器的过程!您需要优化每个实现! 对一种实现的优化可能对另一种实现是悲观的。

    上面描述的虚拟内存抽象与使用缓存分析器消除猜测工作相结合,实际上消除了除消息最少的情况(即使用分析器)之外的所有情况下池的有用性。

    07-24 09:45
    查看更多