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

Wus*_*uhn 4 c++ arrays memory-management stl

以下可能不依赖于平台,但无论如何我都会在Win 10 GCC上修复它.

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

RADIAL_UNITS = 1000000;
static vector<Pearl> necklace[RADIAL_UNITS] = { }; 
//each element is a variable-sized vector, which can consist of anywhere from 1-50 Pearl objects 
Run Code Online (Sandbox Code Playgroud)

或者在main()中的堆栈上分配(假设堆栈空间设置为允许至少1000000个内存地址):

vector<Pearl> necklace[RADIAL_UNITS] = { }; 
Run Code Online (Sandbox Code Playgroud)

我假设在运行时,它necklaceRADIAL_UNITS连续的内存地址组成,指向vector<Pearl>元素.我不清楚的是(i)向量元素所在的内存空间(我怀疑堆空间).

我也感兴趣的附带问题:

我也不清楚(ii)编译器如何知道元素的大小是可变的.STL容器内部是否有定义的内容可以传达此信息?如果它们是固定大小的,我假设它们在字面上连续存在于我们分配数组的任何区域(第二种情况,即堆栈上的分配,可能会导致段错误,除非放大的默认堆栈空间) .(iii)我是否可以修改矢量元素的大小50*sizeof(Pearl),以便将它们分配到最初定义为数组的相同内存空间中?珍珠类型由两个烙印点编号组成,因此它们具有固定的尺寸.

das*_*ght 5

我不清楚的是vector元素所在的内存空间

无论vector分配自身的空间(用于跟踪其可变长度数组中的元素的固定大小的数据结构),元素vector总是驻留在动态存储器中,通常称为"堆".

我也不清楚编译器如何知道元素的大小是可变的.[...]如果它们是固定大小的,我假设它们在字面上连续存在于我们分配数组的任何区域.

vector对象本身具有固定的大小.它充当可变大小数组的"锚",它总是动态分配.编译器无需特殊处理.

我可以修改矢量元素的大小 50*sizeof(Pearl)

你做不到vector,但array让你这样做:

static array<Pearl,50> necklace[RADIAL_UNITS]; 
Run Code Online (Sandbox Code Playgroud)