堆栈和堆上的STL容器

19

如果std::vector和相关类型是自动调整大小的,那么如果我这样声明一个向量:

std::vector<string> myvec;

那么它将使用更多的堆栈进行调整大小,而:

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

使用更多的堆内存能否调整大小?


2
您还可以实现一个“固定大小”的向量,将所有内容存储在堆栈上。 这种方法效果很好,可能是一种优化方式。 但是,代价是它不能无限扩展> 您必须满足于高限制,并且它始终会占用那么多的空间。 - Matthieu M.
很有趣,所以“固定大小”的向量完全在堆栈上? - Benj
1
我不知道有什么“固定大小”的向量,但如果你想要在堆栈上使用固定数据,请考虑使用似乎相似的std::tr1::array。 - stefaanv
@Benj: 不是的,一个向量对象有固定的大小(无论你放多少东西进去)。但是向量(可能)包含指向堆内存分配块的指针,其中保存了放置在向量中的所有对象。 - Martin York
第二个选项的目的是什么? - Omkar Somani
3个回答

26

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

对于基于栈的向量,你只需要支付几个字节的栈空间,内部缓冲区将始终从堆上分配。

因此,当你执行vec = new vector()时,你实际上只分配了一小部分空间,这可能并不是很好。


啊,好的,那么在堆栈上声明的向量一旦超出作用域就会删除它们所使用的内存吗? - Benj
@Benj:是的,当它们超出作用域时,它们会清理内存。 - Naveen
7
请注意,向量只会清理它们自己分配的内存。如果你向向量中添加了堆分配的对象(使用“new”),那么你需要负责调用“delete”来释放它们。也许你已经知道这一点,但我还是想提醒一下,以防万一... - StackedCrooked

9
在第一种情况下,您正在堆栈上创建向量。这并不意味着所有向量内部的对象也都在堆栈上。事实上,vector仍将仅在堆上分配所需的内存以容纳对象。这是因为,在堆栈上分配需要知道要创建的对象数量。但是由于此信息不可用,因此唯一剩下的选项就是从堆中分配所包含对象的内存。

需要注意的是,std::string通常会将其内部的一些“对象”保留在堆栈上。实际上,std::vector是否被禁止这样做? - Mooing Duck

2

std::vector总是在堆上分配其缓冲区。因此,无论向量本身在哪里分配,重新调整大小都只会影响堆。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接