繁体   English   中英

std::vector 的 C++ struct 内存布局

[英]C++ struct memory layout for std::vector

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

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

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

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

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] | ... |
|   |  +------+------+-----+
+---+

v绝对是至少一个指针和(取决于实现)其他一些记帐的包装器。 v的栈上(或数组内)足迹将仅限于直接在std::vector类中声明的那些成员,是的,这意味着v的大小,以及S实例的大小,将是恒定的。

代表v (和S实例)消耗的字节数将取决于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` 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM