[英]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
将在内存中以这样的方式排列(可能在a
和v
之间有一些填充以保持对齐):
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.