在C+中的堆栈上分配数量可变的对象+; 我想知道是否有一种标准的方法来分配一个可变数量的对象,这些堆栈是当今所有C++编译器支持的。假设我有一个类 Foo,一个不平凡的公共构造函数,它需要0个参数,我想在堆上分配这个类的10个实例,那么我可以在C++中使用运算符 NeX[]/COD> function doSomething() { Foo * foos = new Foo[10]; ... }

在C+中的堆栈上分配数量可变的对象+; 我想知道是否有一种标准的方法来分配一个可变数量的对象,这些堆栈是当今所有C++编译器支持的。假设我有一个类 Foo,一个不平凡的公共构造函数,它需要0个参数,我想在堆上分配这个类的10个实例,那么我可以在C++中使用运算符 NeX[]/COD> function doSomething() { Foo * foos = new Foo[10]; ... },c++,stack,allocation,dynamic-allocation,C++,Stack,Allocation,Dynamic Allocation,如果要分配的对象数量在编译时未知,我仍然可以以类似的方式使用操作符new[]: function doSomething(size_t count) { Foo * foos = new Foo[count]; ... } 因此,如果我决定在堆栈而不是堆上分配类的10个实例,我会使用常规数组定义: function doSomething() { Foo array[10]; Foo * foos = array; ... } 或者可能只是Foo-fo

如果要分配的对象数量在编译时未知,我仍然可以以类似的方式使用操作符
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());
std::向量对象;
int runtimeCalculatedSize=复杂的RuntimeSizeCalculationMethod();
resize(runtimeCalculatedSize,MyObject());

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

std::vector<Foo> foos(count);
std::向量foos(计数);

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

“我使用。。。什么?至少GCC支持使用
Foo数组[n],其中
n
是一个局部变量、参数、类成员等等…如果我可以共享这个。。。你的意思是在上一段的前半部分说“堆栈”而不是“堆”?@g-makulik谢谢,我认为这是一个非标准的功能,可能不是所有编译器都支持。对于这整件事中唯一真正需要回答的问题,简短的回答是:不,没有。你想要的是VC++中的VLA。VLA的和它们固有的危险受到C社区的喜爱,他们很可能会被禁止将来的C,所以不要在C++中期待它们的到来。向量元素是在堆上分配的,而不是在堆栈上。@GOTO0是的!你说得对。对不起,我没有考虑到你问题的这一方面。您不想在堆上分配对象的具体原因是什么?缺少适合您的环境的
/
删除
实现?实际上只是好奇而已<所有平台都应支持代码>新建
和删除
。@GOTO0“所有平台都应支持新建和删除。”否!太离谱了,不!我正在开发的嵌入式固件根本无法使用堆分配(
new
/
delete
)。我对已知或编译时可计算的大小使用
std::array
,但ehhm也使用“不可移植”的动态堆栈分配。我不确定这是否还没有得到标准的保证,但一般来说,这并不适用于@GOTO0。那么顺便问一下,您(真正的)可移植性要求是什么?在你的问题中详细说明。。。