std::vector 的 C++ 结构体内存布局

Ted*_*ing -1 c++ struct vector

对于以下结构体,由于 v 是动态分配的对象,那么内存对齐如何工作?struct S即使 v 的大小变大,其大小也是恒定的吗?那么 v 本质上是作为一个指针(或者某种指针的包装器)工作的吗?

struct S {
    ANY_TYPE a;
    std::vector<ANY_TYPE> v;
} s;
Run Code Online (Sandbox Code Playgroud)

如果上述所有问题的答案都是肯定的,那么随着 v 大小的变化,其成员的内存存储在哪里?这些内存是在堆上还是在堆栈上?

编辑:我看到这个问题的反对票,并意识到我应该对 std::vector 本身进行更多研究。我读了这篇文章,一切都清楚了。感谢您的回答!

Mil*_*nek 6

v不是动态分配的。其std::vector本身是S对象的一部分。 v然而,它拥有一个动态分配的缓冲区。

这意味着它sizeof(S)是恒定的。永远都是sizeof(ANY_TYPE) + sizeof(std::vector<ANY_TYPE>) + padding

本质上,S将在内存中布局如下(可能在a和之间有一些填充v以保持对齐):

  S
+---+
|   |
| a |
|   |
+---+
|   |
| v |    dynamically allocated buffer
|   |  +------+------+-----+
| +----> v[0] | v[1] | ... |
|   |  +------+------+-----+
+---+
Run Code Online (Sandbox Code Playgroud)