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

C++ C++;std::vector的结构内存布局,c++,vector,struct,C++,Vector,Struct,对于下面的结构,由于v是一个动态分配的对象,内存对齐将如何工作?struct S的大小是否与v的大小一样恒定?那么v本质上是作为指针(或指针的某种包装器)工作的吗 结构{ 任何类型a; std::vector,这让一切都变得清晰了。感谢您的回答!v肯定是一个至少包含一个指针和(取决于实现)一些其他记帐的包装器。堆栈上(或数组中)v的封装外形将仅限于直接在std::vector类中声明的那些成员,是的,这意味着v的大小以及S的实例大小将是恒定的 代表v(以及S的实例)消耗的字节数将取决于v在其构造

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

结构{
任何类型a;

std::vector,这让一切都变得清晰了。感谢您的回答!

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` 

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

这意味着
sizeof(S)
是常量。它将始终是
sizeof(任何类型)+sizeof(std::vector)+padding

本质上,
S
将在内存中以类似的方式排列(可能在
a
v
之间添加一些填充以保持对齐):


感谢您简洁而有用的回答!那么我能理解您图形中左箭头的来源,即包装在对象v中的指针吗?是的,
std::vector
通常包含指向其动态分配缓冲区的第一个元素的指针。(它通常有两个其他成员:其当前大小和容量).可能的副本
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` 
  S
+---+
|   |
| a |
|   |
+---+
|   |
| v |    dynamically allocated buffer
|   |  +------+------+-----+
| +----> v[0] | v[1] | ... |
|   |  +------+------+-----+
+---+