Я хотел бы знать, есть ли стандартный способ распределения переменной количества объектов в стеке, которые поддерживают все сегодняшние компиляторы C++. Предположим, что у меня есть класс Foo
с нетривиальным публичным конструктором, который принимает 0 аргументов, и я хочу выделить 10 экземпляров этого класса в куче, тогда я мог бы использовать оператор new[]
в C++ следующим образом:
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
, но я не знаю, что делать с объектами, которые нуждаются в инициализации.
Ну, если ленивый и не беспокоясь о переносимости, я использую: Foo array [n]; Это стандартный код C, но был удален из стандарта C++. Но поскольку большинство компиляторов делают оба, у большинства компиляторов это есть. Канонический способ - объявить std :: vector вашего типа желаемой длины.
std::vector<Foo> foos(count);
Но, делая это, не будет строго помещать данные в стек, есть ли какие-либо причины, почему использование стека важно для вас?
Как насчет:
std::vector<MyObject> myObjects;
int runtimeCalculatedSize = sophisticatedRuntimeSizeCalculationMethod();
myObjects.resize(runtimeCalculatedSize,MyObject());
new
/ delete
реализации для вашей среды?
Foo array[n];
гдеn
- локальная переменная, параметр, член класса, что угодно ...