【问题标题】:STL containers on the stack and the heap堆栈和堆上的 STL 容器
【发布时间】:2009-10-29 10:53:10
【问题描述】:

如果 std::vector 和朋友都在自我调整大小,这是否意味着如果我这样声明一个向量:

std::vector<string> myvec;

然后它将使用更多堆栈调整大小,而:

std::vector<string> *myvec = new std::vector<string>();

会使用更多堆来调整大小吗?

【问题讨论】:

  • 您还可以实现一个“固定大小”向量来将所有这些存储在堆栈中。它工作得很好,可能是一种优化。然而,代价是它不能无限扩展 > 你必须满足于一个上限,而且它总是会消耗那么多空间。
  • 这很有趣,所以一个“固定大小”的向量完全在堆栈上?
  • 我不知道“固定大小”向量,但是如果您希望堆栈上的固定数据,请考虑使用 std::tr1::array,这看起来很相似。
  • @Benj:不。矢量对象具有固定大小(无论您放入多少)。但是向量(可能)包含一个指向堆分配的存储块的指针,它将所有对象保存在向量内。
  • 第二个选项的目的是什么?

标签: c++ stl memory-management


【解决方案1】:

向量在其内部的堆上分配。

您在堆栈中为基于堆栈的 bector 支付的唯一费用是几个字节,内部缓冲区将始终从堆中分配。

当您执行 vec = new vector() 时非常有效,您分配的数量很少,这可能不是很好。

【讨论】:

  • 嗯,好的,那么在堆栈上声明的向量是否会在超出范围后删除它们使用的内存?
  • @Benj:是的,他们会在超出范围时清理内存。
  • @Benj:请注意,向量只会清理它们自己分配的内存。如果您将堆分配的对象(带有“new”)添加到向量中,那么您有责任对它们调用“delete”。也许你已经知道了,但我想提一下以防万一......
【解决方案2】:

在第一种情况下,您在堆栈上创建向量。这并不意味着所有向量内部对象也都在堆栈上。实际上,vector 仍将分配仅在堆上保存对象所需的内存。这是因为,要在堆栈上分配,您应该知道要创建多少个对象。但是这个信息不可用,所以唯一剩下的选择是从堆中为包含的对象分配内存。

【讨论】:

  • 还应该注意的是,std::string 将它的一些内部“对象”保留在堆栈上是很常见的。实际上,是否禁止 std::vector 这样做?
【解决方案3】:

std::vector 总是在堆上分配缓冲区。所以无论向量本身被分配到哪里,调整大小只会影响堆。

【讨论】:

    猜你喜欢
    • 2011-05-06
    • 2021-12-20
    • 2014-06-23
    • 1970-01-01
    • 2011-07-24
    • 1970-01-01
    • 2013-03-21
    • 2016-04-20
    • 1970-01-01
    相关资源
    最近更新 更多