堆栈和堆上的STL容器

时间:2009-10-29 10:53:11

标签: c++ stl memory-management

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

std::vector<string> myvec;

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

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

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

3 个答案:

答案 0 :(得分:24)

向量在堆内部分配。

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

当你做一个vec = new vector()时,你会分配一小部分,这可能不是很好。

答案 1 :(得分:9)

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

答案 2 :(得分:1)

std :: vector总是在堆上分配缓冲区。因此,无论向量本身在何处分配大小,它都只会影响堆。