在C++中在堆栈上分配可变数量的对象

Allocating a variable number of objects on the stack in C++

本文关键字:对象 分配 C++ 堆栈      更新时间:2023-10-16

我想知道是否有一种标准的方法可以在堆栈上分配可变数量的对象,而现在所有的C++编译器都支持这种方法。假设我有一个类Foo,它有一个接受0个参数的非平凡公共构造函数,并且我想在堆上分配该类的10个实例,那么我可以在C++中使用运算符new[],如下所示:

function doSomething() {
    Foo * foos = new Foo[10];
    ...
}

如果在编译时不知道要分配的对象数量,我仍然可以以类似的方式使用运算符new[]

function doSomething(size_t count) {
    Foo * foos = new Foo[count];
    ...
}

因此,如果我决定在堆栈上而不是堆上分配类的10个实例,我会使用一个常规的数组定义:

function doSomething() {
    Foo array[10];
    Foo * foos = array;
    ...
}

或者可能只是Foo foos[10];,以防我以后不需要重新分配foos,好吧。

现在,如果我想在堆栈上分配的对象数量只在运行时已知,我使用。。。什么我能想到的在堆栈上动态分配连续内存的唯一方法是调用非标准的内在函数alloca,但我不知道该如何处理需要初始化的对象。

关于:

std::vector<MyObject> myObjects;
int runtimeCalculatedSize = sophisticatedRuntimeSizeCalculationMethod();
myObjects.resize(runtimeCalculatedSize,MyObject());

好吧,如果懒惰,并且不担心可移植性,我使用:Foo-array[n];这是标准的C代码,但已从C++标准中删除。但是,由于大多数编译器同时具有这两种功能,因此大多数编译器都具有这一功能。规范的方法是声明所需长度的类型的std::向量。

std::vector<Foo> foos(count);

但是,这样做不会严格地将数据放在堆栈上,使用堆栈对您来说很重要有什么原因吗?