C++ 静态或堆栈分配数组的可变大小元素是否驻留在堆空间中?

C++ 静态或堆栈分配数组的可变大小元素是否驻留在堆空间中?,c++,arrays,memory-management,stl,C++,Arrays,Memory Management,Stl,以下内容可能不依赖于平台,但无论如何我都会在Win10GCC中修复它 假设您在main()的静态内存空间中创建了一个数组或向量,该数组或向量由每个元素的大小可变的元素组成: 径向单位=1000000; 静态矢量项链[径向单位]={}; //每个元素都是一个大小可变的向量,可以由1-50个Pearl对象组成 或在main()中的堆栈上分配(假设堆栈空间设置为允许至少1000000个内存地址): 矢量项链[径向单位]={}; 我假设在运行时,项链由径向单元连续内存地址组成,指向向量元素。我不清楚

以下内容可能不依赖于平台,但无论如何我都会在Win10GCC中修复它

假设您在main()的静态内存空间中创建了一个数组或向量,该数组或向量由每个元素的大小可变的元素组成:

径向单位=1000000;
静态矢量项链[径向单位]={};
//每个元素都是一个大小可变的向量,可以由1-50个Pearl对象组成
或在main()中的堆栈上分配(假设堆栈空间设置为允许至少1000000个内存地址):

矢量项链[径向单位]={};
我假设在运行时,
项链
径向单元
连续内存地址组成,指向
向量
元素。我不清楚的是(i)向量元素所在的内存空间(我怀疑是堆空间)

我也感兴趣的一些次要问题:

我也不清楚(ii)编译器如何知道元素的大小是可变的。STL容器是否有内部定义的东西来传达这一点?如果它们的大小是固定的,我假设它们实际上会连续出现在我们分配数组到的任何区域(第二种情况,即堆栈上的分配,可能会导致segfault,除非默认堆栈空间被放大)。(iii)我是否可以将向量元素的大小固定为
50*sizeof(Pearl)
,以便在数组最初定义为的相同内存空间中分配它们?珍珠类型由两个扁平点编号组成,因此它们的大小是固定的

我不清楚的是
向量
元素驻留在哪个内存空间中

无论
向量
本身被分配到哪个空间(用于跟踪可变长度数组中元素的固定大小数据结构),
向量
的元素始终驻留在动态内存中,通常称为“堆”

我也不清楚编译器如何知道元素的大小是可变的。[…]如果它们的大小是固定的,我假设它们实际上会连续出现在我们分配阵列到的任何区域中

向量
对象本身具有固定大小。它充当可变大小数组的“锚”,数组总是动态分配的。编译器不需要特殊处理

我是否可以将向量元素的大小固定为
50*sizeof(Pearl)

您不能使用
向量
执行此操作,但允许您执行以下操作:

static array<Pearl,50> necklace[RADIAL_UNITS]; 
静态数组项链[RADIAL_UNITS];

如果将数组声明为局部变量,大多数编译器会将其放在堆栈上。如果数组是(非静态)类成员变量,那么它将存储在存储对象其余部分的任何位置(如果对象实例是静态对象,则可能是堆或堆栈或其他位置)。向量本身中的内存将从堆中分配(使用默认分配器)。顺便说一下,“项链由径向_单元组成,连续内存地址,指向向量元素”部分是错误的。数组
项链
将是一个连续的内存区域,但不是指针,而是
径向单位
个数
std::vector
实例。数组的大小(字节)将是
径向单位*sizeof(std::vector)
。请注意,
sizeof(std::vector)
与向量中的元素数无关。是的,我的误解是,珍珠对象的管理发生在数组中,而实际上std:vector处理所有这些内容,并且非常轻量级。我不明白的是,std:vector本身也像dasblinkenlight所指出的那样管理堆上的元素。谢谢
vector<Pearl> necklace[RADIAL_UNITS] = { }; 
static array<Pearl,50> necklace[RADIAL_UNITS];