【问题标题】:When does boost::deque allocate/deallocate?boost::deque 何时分配/解除分配?
【发布时间】:2020-11-28 16:12:25
【问题描述】:

我试图找到一些关于boost::container::deque 分配/解除分配行为的保证,但找不到。我的假设如下。

  1. 如果有空闲块,则不会分配块。
  2. 它保留了所有被释放的块,所以分配的块只有在shrink_to_fit?之后才会被释放?
  3. 当没有空间容纳新项目时,将分配新块。如果新分配的块的句柄没有空间,所有的块句柄都会被重新分配。

这些假设正确吗?

【问题讨论】:

    标签: c++ data-structures boost memory-management deque


    【解决方案1】:

    boost::deque 何时分配/解除分配?

    当容器被销毁时,内存将被释放。当容器收缩时,未使用的内存可能会被释放。否则分配和释放没有记录,因此细节取决于库的实现。

    1. 如果有空闲块,则不会分配块。

    这是一个合理的预期,但文档无法保证。

    1. 它保留了所有被释放的块,所以分配的块只有在shrink_to_fit之后才会被释放?

    文档也不保证这一点。请注意,与向量不同,deque 可以满足其复杂性要求,即使它提前释放。

    1. 当没有空间容纳新项目时,将分配新块。如果新分配的块的句柄没有空间,所有的块句柄都会被重新分配。

    文档也不保证。然而,当没有可用空间时分配内存是合理的。

    【讨论】:

    • boost 的行为不是实现定义的,它是boost::container 背后的动机之一。
    • @Vahagn 如果文档未定义,则取决于实现的选择。 boost库的实现;不是语言实现。
    【解决方案2】:

    正如指出的here 和检查的here,第二个假设对于boost::container::deque(以及所有编译器的std::deque 实现)是不正确的。

    它提前解除分配!顺便说一句,如果没有办法阻止,那我就达不到提供boost::container::deque::shrink_to_fit的目的了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-30
      • 1970-01-01
      • 2020-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-08
      相关资源
      最近更新 更多