当向量被分配时,他们是否使用堆或堆栈上的内存?
以下所有的陈述是正确的吗?
vector<Type> vect; //allocates vect on stack and each of the Type (using std::allocator) also will be on the stack vector<Type> *vect = new vector<Type>; //allocates vect on heap and each of the Type will be allocated on stack vector<Type*> vect; //vect will be on stack and Type* will be on heap.
在vector
或任何其他STL容器中Type
的内存是如何分配的?
vector<Type> vect;
将在堆栈上分配vector
(即标题信息),但是分配空闲存储(“堆”)上的元素。
vector<Type> *vect = new vector<Type>;
在免费商店分配一切。
vector<Type*> vect;
将分配堆栈上的vector
和免费商店中的一堆指针,但是这些点是由你如何使用它们决定的(你可以将元素0指向自由存储区,元素1指向堆栈)。
假设一个实际上有一个堆栈和一个堆的实现(标准C ++没有要求有这样的事情)唯一真实的声明是最后一个。
vector<Type> vect; //allocates vect on stack and each of the Type (using std::allocator) also will be on the stack
这是真的,除了最后一部分( Type
不会在堆栈上)。 想像:
void foo(vector<Type>& vec) { // Can't be on stack - how would the stack "expand" // to make the extra space required between main and foo? vec.push_back(Type()); } int main() { vector<Type> bar; foo(bar); }
同样:
vector<Type> *vect = new vector<Type>; //allocates vect on heap and each of the Type will be allocated on stack
除了最后一部分,还有一个类似的反例:
void foo(vector<Type> *vec) { // Can't be on stack - how would the stack "expand" // to make the extra space required between main and foo? vec->push_back(Type()); } int main() { vector<Type> *bar = new vector<Type>; foo(bar); }
对于:
vector<Type*> vect; //vect will be on stack and Type* will be on heap.
这是真的,但请注意Type*
指针将在堆上,但它们指向的Type
实例不必是:
int main() { vector<Type*> bar; Type foo; bar.push_back(&foo); }
vector<Type> vect; //allocates vect on stack and each of the Type (using std::allocator) also will be on the stack
不, vect
将在堆栈中,但它在内部用于存储项目的数组将在堆上。 项目将驻留在该数组中。
vector<Type> *vect = new vector<Type>; //allocates vect on heap and each of the Type will be allocated on stack
与上面相同,只有vector
类将在堆上。
vector<Type*> vect; //vect will be on stack and Type* will be on heap.
vect
将在堆栈上,它的项(指向Type
)将在堆上,而且不能指出指针将指向哪个Type
。 可能在堆栈上,可能在堆上,可能在全局数据中,可能是无处(即NULL
指针)。
顺便说一下,这个实现实际上可以将一些向量(通常是小尺寸)完全存储在堆栈中。 不是我知道任何这样的实现,但它可以。
只有这个陈述是真实的:
vector <Type*> vect; //vect will be on stack and Type* will be on heap.
Type*
指针在堆上分配,因为指针的数量可以dynamic改变。
在这种情况下vect
被分配在堆栈上,因为你将它定义为本地堆栈variables。