在C ++中,有两种方法可以声明一个对象。例如:
// The first way
vector<int> *nums = new vector<int>;
// The second way
vector<int> nums;
人们说第一个声明在堆中分配对象,在堆栈中分配第二个声明。我可以想象,如果矢量对象在堆中,它是如何工作的。编译器只会在堆中找到一个空闲块来存储向量。但是如果在堆栈中分配对象时会发生什么情况,因为我不断将新元素推送到向量?会有足够的内存空间吗?如果没有,当向量的大小发生变化时,编译器如何在堆栈上找到足够大的内存块来存储向量?
答案 0 :(得分:10)
将vector
对象置于堆栈上并不意味着它将其元素放在堆栈上。检查文档:
在内部,矢量使用动态分配的数组来存储它们的元素。可能需要重新分配此数组,以便在插入新元素时增大大小,这意味着分配新数组并将所有元素移动到该数组。