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

时间:2018-09-19 01:47:23

标签: c++ vector struct

对于以下结构,由于v是动态分配的对象,因此内存对齐将如何工作? struct S的大小是否恒定,即使v的大小不变?那么v本质上可以用作指针(或某种指针的包装器)吗?

struct S {
    ANY_TYPE a;
    std::vector<ANY_TYPE> v;
} s;

如果上述所有问题的答案都是肯定的,那么随着v的大小增加,其成员的内存存储在哪里?这些被视为堆或堆栈上的内存吗?

编辑:我对这个问题不满意,并意识到我应该对std :: vector本身做更多的研究。我读了这个post,使一切变得清晰。谢谢您的回答!

2 个答案:

答案 0 :(得分:4)

v不会动态分配。 std::vector本身是S对象的一部分。 v确实拥有一个动态分配的缓冲区。

这意味着sizeof(S)是常数。永远是sizeof(ANY_TYPE) + sizeof(std::vector<ANY_TYPE>) + padding

本质上,S会在内存中这样布局(可能在av之间进行填充以保持对齐):

  S
+---+
|   |
| a |
|   |
+---+
|   |
| v |    dynamically allocated buffer
|   |  +------+------+-----+
| +----> v[0] | v[1] | ... |
|   |  +------+------+-----+
+---+

答案 1 :(得分:0)

v绝对是至少一个指针和(取决于实现方式)其他一些计数的包装。 v的堆栈(或数组内)占用空间将仅限于直接在std::vector类内声明的那些成员,是的,这意味着v的大小,因此S实例的大小将是恒定的。

代表 v(以及S实例)消耗的字节数取决于分配的 heap 内存量。 v在其构建和使用过程中。

S的直接成员(包括v)使用的内存由执行声明的代码确定:

void my_func() {
    S s1;          // `s1` and its members `a` and `v` are all on the stack
                   //  ...though `v` will allocate heap memory for its own use
    S* s2 = new S; // `s2` points to a heap-allocated instance of `S`