如果我声明一个这样的矢量:
int main() {
vector<string> names;
int something_else_on_the_stack = 0;
names.add("John");
names.add("Annie");
}
你怎么能够在名字向量中“添加”元素?如果名称是堆栈分配的,那么堆栈上的“something_else_on_the_stack”不应该在它之后吗?那么如何为已经分配的向量添加名称?
答案 0 :(得分:8)
在内部,vector<string>
很可能由指向实际数据的string*
和可能还有两个size_t
成员指示占用和保留内存组成。其余的都将在堆上。因此,sizeof(vector<string>)
是固定的,堆栈上的分配不会改变。
答案 1 :(得分:7)
std::vector
internaly维护一个指向堆分配空间的指针,该空间根据需要调整大小。堆栈上的占用空间不会改变。
答案 2 :(得分:2)
堆栈上vector<string>
占用的大小是固定的,通常等于3个指针的大小(这是特定于实现的)。指针指向存储的开始,向量容量和向量大小。这些指针指向免费存储内存(或堆,如果你想调用它),向量根据需要分配以保存你添加到向量的对象。