C++ 堆栈和堆上的STL容器

C++ 堆栈和堆上的STL容器,c++,stl,memory-management,C++,Stl,Memory Management,如果std::vector和friends正在自我调整大小,这是否意味着如果我这样声明一个向量: std::vector<string> myvec; std::vector myvec; 然后它将使用更多堆栈调整大小,而: std::vector<string> *myvec = new std::vector<string>(); std::vector*myvec=new std::vector(); 是否使用更多堆调整大小?std::vecto

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

std::vector<string> myvec;
std::vector myvec;
然后它将使用更多堆栈调整大小,而:

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

是否使用更多堆调整大小?

std::vector始终在堆上分配其缓冲区。因此,无论向量本身被分配到何处,调整其大小都只会影响堆。

向量在堆的内部进行分配

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


因此,当您执行vec=new vector()时,实际上是在分配少量,这可能不是很好。

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

您还可以实现一个“固定大小”向量来将所有这些存储在堆栈上。它工作得很好,可能是一种优化。但是,代价是它不是无限可扩展的。你必须解决一个高的限制,而且它总是消耗这么多的空间。有趣的是,一个“固定大小”的向量完全在栈上。我不知道一个“固定大小”的向量,但是如果你想把固定的数据放在堆栈上,考虑使用STD::Tr1::这看起来很相似。@Benj:不。向量对象有固定的大小(不管你在其中投入多少)。但是向量(可能)包含一个指向堆分配的存储块的指针,它将所有对象放在向量中。第二个选项的目的是什么?啊,好的,那么堆栈上声明的向量一旦超出范围,是否会删除它们使用的内存?@Benj:是的,当它们超出范围时,它们将清理内存。@Benj:请注意,向量只清理它们自己分配的内存。如果将堆分配的对象(带有“new”)添加到向量中,则负责对其调用“delete”。也许您已经知道了这一点,但我想提一下以防万一……还应该注意,std::string在堆栈上保留一些内部“对象”是很常见的。实际上,std::vector是被禁止这样做的吗?