Правильный ответ был фактически предоставлен в этой теме, поэтому я просто хочу предоставить ему больше контекста.
Вам необходимо создать собственный распределитель, который использует функцию alloca()
(или _alloca()
в Windows) для динамического выделения стека. Его очень легко создать, вы можете использовать типичный шаблон распределителя, изменить функцию-член allocate () на return (pointer)(alloca(size * sizeof(T)));
и сделать функцию deallocate()
пустой, потому что нет ручного освобождения стека. После этого вы можете поставить свой распределитель в стандартные контейнеры, например, vector<T, stack_allocator<T>>
.
Однако есть две оговорки. Размер стека, выделяемого для выделения, может значительно различаться, часто у вас есть возможность установить его во время компиляции. Visual Studio в 32-битных приложениях, по-моему, ограничивает его размером до 1 МБ. Другие компиляторы могут иметь другие ограничения. В 64-битных приложениях проблем на самом деле нет, так как стек может быть размером с кучу. Вероятно, вам потребуется перехватить структурированное исключение при переполнении стека и преобразовать его в исключение C ++.
Второе предупреждение: вам никогда не следует копировать указатели стека за пределы вашей функции, поэтому семантика перемещения, например, не будет работать, если вы передадите объекты, выделенные из стека, в / из функции.
И еще одно неудобство: вы не можете копировать контейнеры с несовместимыми распределителями, но вы можете копировать их поэлементно. Э.Г.
vector<int> vint;
vector<int, static_allocator<int>> vsint;
vint = vsint; // won't compile, different allocators
std::copy(vsint.begin(), vsint.end(), vint.begin()); // fine