如果我像这样声明一个向量:
int main() {
vector<string> names;
int something_else_on_the_stack = 0;
names.add("John");
names.add("Annie");
}
您实际上如何能够将元素“添加”到名称向量中?如果名称是堆栈分配的,“something_else_on_the_stack”不应该在堆栈上紧随其后吗?那么如何将名称添加到已分配的向量中?
如果我像这样声明一个向量:
int main() {
vector<string> names;
int something_else_on_the_stack = 0;
names.add("John");
names.add("Annie");
}
您实际上如何能够将元素“添加”到名称向量中?如果名称是堆栈分配的,“something_else_on_the_stack”不应该在堆栈上紧随其后吗?那么如何将名称添加到已分配的向量中?
在内部,avector<string>
很可能包括一个string*
指向实际数据的指针和可能另外两个size_t
指示占用和保留内存的成员。其余的都将在堆上。因此,sizeof(vector<string>)
是固定的,堆栈上的分配不会改变。
std::vector
internaly 维护一个指向堆分配空间的指针,该指针根据需要调整大小。堆栈上的足迹不会改变。
a 在堆栈上占用的大小vector<string>
是固定的,通常等于 3 个指针的大小(这是特定于实现的)。指针指向存储的开始、向量容量和向量大小。这些指针指向向量根据需要分配的空闲存储内存(或堆,如果你想调用它)来保存你添加到向量中的对象。