对于以下结构,由于v是动态分配的对象,因此内存对齐将如何工作? struct S
的大小是否恒定,即使v的大小不变?那么v本质上可以用作指针(或某种指针的包装器)吗?
struct S {
ANY_TYPE a;
std::vector<ANY_TYPE> v;
} s;
如果上述所有问题的答案都是肯定的,那么随着v的大小增加,其成员的内存存储在哪里?这些被视为堆或堆栈上的内存吗?
编辑:我对这个问题不满意,并意识到我应该对std :: vector本身做更多的研究。我读了这个post,使一切变得清晰。谢谢您的回答!
答案 0 :(得分:4)
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] | ... |
| | +------+------+-----+
+---+
答案 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`