【问题标题】:How does a stack-allocated vector expand in c++?堆栈分配的向量如何在 C++ 中展开?
【发布时间】:2012-09-12 11:51:29
【问题描述】:

如果我这样声明一个向量:

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

您实际上如何能够将元素“添加”到名称向量中?如果名称是堆栈分配的,“something_else_on_the_stack”不应该在堆栈上紧随其后吗?那么如何给已经分配好的向量加名字呢?

【问题讨论】:

  • 如果我错了,请原谅我,但 std::vector 数据不是总是堆分配的吗?
  • @AndreasHenning 向量是堆栈分配的,它的数据通常是动态分配的,但是 C++ 标准没有说明堆栈或堆。

标签: c++ memory memory-management callstack


【解决方案1】:

在内部,vector&lt;string&gt; 很可能由指向实际数据的string* 和另外两个指示占用和保留内存的size_t 成员组成。其余的都将在堆上。所以sizeof(vector&lt;string&gt;)是固定的,栈上的分配不会改变。

【讨论】:

    【解决方案2】:

    std::vector 在内部维护一个指向堆分配空间的指针,该指针会根据需要调整大小。堆栈上的足迹没有改变。

    【讨论】:

      【解决方案3】:

      vector&lt;string&gt; 在堆栈上占用的大小是固定的,通常等于 3 个指针的大小(这是特定于实现的)。指针指向存储的开始、向量容量和向量大小。这些指针指向向量根据需要分配的空闲存储内存(或堆,如果你想这样称呼它)来保存你添加到向量中的对象。

      【讨论】:

        猜你喜欢
        • 2020-03-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-04
        • 1970-01-01
        • 1970-01-01
        • 2014-04-17
        • 1970-01-01
        相关资源
        最近更新 更多