堆栈分配的向量如何在c ++中扩展?

时间:2012-09-20 06:28:28

标签: c++ memory memory-management callstack

如果我声明一个这样的矢量:

int main() {
    vector<string> names;
    int something_else_on_the_stack = 0;
    names.add("John");
    names.add("Annie");
}

你怎么能够在名字向量中“添加”元素?如果名称是堆栈分配的,那么堆栈上的“something_else_on_the_stack”不应该在它之后吗?那么如何为已经分配的向量添加名称?

3 个答案:

答案 0 :(得分:8)

在内部,vector<string>很可能由指向实际数据的string*和可能还有两个size_t成员指示占用和保留内存组成。其余的都将在堆上。因此,sizeof(vector<string>)是固定的,堆栈上的分配不会改变。

答案 1 :(得分:7)

std::vector internaly维护一个指向堆分配空间的指针,该空间根据需要调整大小。堆栈上的占用空间不会改变。

答案 2 :(得分:2)

堆栈上vector<string>占用的大小是固定的,通常等于3个指针的大小(这是特定于实现的)。指针指向存储的开始,向量容量和向量大小。这些指针指向免费存储内存(或堆,如果你想调用它),向量根据需要分配以保存你添加到向量的对象。