C++ C++;std::vector的结构内存布局
对于下面的结构,由于v是一个动态分配的对象,内存对齐将如何工作?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在其构造
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] | ... |
| | +------+------+-----+
+---+