В C++ нет понятия стека или кучи. Это детали реализации, и есть по крайней мере одна платформа, которая не использует традиционный стек (а скорее связанный список распределений кучи для него).
У этого есть автоматическое хранение и свободный магазин. new
обращается к свободному хранилищу, а переменные «в стеке» переходят в автоматическое хранилище.
На практике, чтобы распределять вещи в свободном хранилище, вам приходится рисковать исключением из памяти. Таким образом, общее правило - это вещи, которые гарантируют, что они не выбрасывают, должны использовать автоматическое хранилище. array
делает эту гарантию (за исключением того, что в ней можно бросить, нагло). Это также совокупность простых старых данных, эффективно вынуждено выглядеть так:
template<class T,std::size_t N>
struct array {
T __no_fixed_name__[N];
// non-constructor/destructor methods omitted as they are noise at this point
};
В теории, это может быть реализовано с помощью компилятора с помощью магии, которая не является фактическим C++, но нет никакой необходимости, так никто надоедает.
TL; DR: да, это на стеке.
+1 Другими словами, вы получаете те же гарантии, что и 'template struct array {T elems [N]; }; 'w.r.t. layout ('elems' фактически не существует). –
GManNickG
@towi: Обратите внимание, что C++ на самом деле не имеет понятия стека или кучи. Обычно мы получаем то, что вы имеете в виду, но вы спросили «по стандарту C++». Вы получаете те же гарантии, что и приведенный выше пример; как это распределяется, зависит от вашей реализации. (В теории я мог бы написать немой компилятор, который вообще не использует стек, и динамически выделяет все.) – GManNickG
@GManNickG Знаешь, я полностью пропустил это! «нет понятия стека и кучи», на самом деле? Также нет «динамически» или «статически» выделено? Возможно, вы правы, быстрый поиск в Std согласен с этим. Я предполагаю, что определение, если 'new' и spec' ', описывающее динамическое распределение, специально заставило меня пропустить отсутствие статической спецификации распределения. Учитывая ваш немой компилятор, мне интересно, можно ли вообще сделать все на стеке. Нет, вероятно, нет, как я могу поддержать «новый»? Но это другой вопрос. –
towi