Выделение переменного количества объектов в стеке в C ++

0

Я хотел бы знать, есть ли стандартный способ распределения переменной количества объектов в стеке, которые поддерживают все сегодняшние компиляторы 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, но я не знаю, что делать с объектами, которые нуждаются в инициализации.

  • 1
    'Я использую ... что?' По крайней мере, GCC поддерживает использование Foo array[n]; где n - локальная переменная, параметр, член класса, что угодно ...
  • 0
    Если я могу поделиться этим ... stackoverflow.com/q/1887097/2809095
Показать ещё 4 комментария
Теги:
stack
allocation
dynamic-allocation

2 ответа

0

Ну, если ленивый и не беспокоясь о переносимости, я использую: Foo array [n]; Это стандартный код C, но был удален из стандарта C++. Но поскольку большинство компиляторов делают оба, у большинства компиляторов это есть. Канонический способ - объявить std :: vector вашего типа желаемой длины.

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

Но, делая это, не будет строго помещать данные в стек, есть ли какие-либо причины, почему использование стека важно для вас?

0

Как насчет:

std::vector<MyObject> myObjects;

int runtimeCalculatedSize = sophisticatedRuntimeSizeCalculationMethod();

myObjects.resize(runtimeCalculatedSize,MyObject());
  • 0
    Векторные элементы размещаются в куче, а не в стеке.
  • 0
    @ GOTO0 Ага! Вы правы. Извините, я не учел этот аспект вашего вопроса в первую очередь. Каковы ваши конкретные причины, вы не хотите размещать объекты в куче? Не хватает подходящей new / delete реализации для вашей среды?
Показать ещё 8 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню