Есть ли в std :: array & lt; & gt; гарантированное распределение только в стеке?

Является std::array<int,10> (без меня, используя new) гарантированно будет выделено в стеке, а не в куче C ++ — Standard?

Чтобы быть понятным, я не имею в виду new std::array<int, 10>, Мне в основном интересно, разрешено ли использовать стандартную библиотеку new внутри его реализации.

23

Решение

Я не мог найти более четкий ответ в стандарте, но [array.overview]/2:

Массив является агрегатом ([dcl.init.aggr]), который может быть инициализирован списком до N элементы, типы которых могут быть преобразованы в T,

А также [dcl.init.aggr]/1:

Агрегат — это массив или класс (пункт [class]) с

  • не предоставлено пользователем, явный или унаследованный конструкторы ([class.ctor]),

Это о покрывает это. Ни в коем случае агрегат не может выделять память динамически (или, возможно, делать что-либо вообще самостоятельно во время построения). Есть только неявно объявленный тривиальный конструктор.

Конечно, если вы new std::array<...>, вы получаете массив на «куче».


Некоторые могут быть более удовлетворены тем, что мы можем получить на cppreference:

std::array является контейнером, который инкапсулирует массивы фиксированного размера.

Этот контейнер является агрегатным типом с той же семантикой, что и структура, содержащая массив в стиле C T[N] как его единственный нестатический член данных.


В-третьих, std::array был введен в C ++ 11. Зачем? Например, чтобы дополнить std::vector в некотором смысле, как использование в constexpr функции, где динамическое размещение не допускается.

14

Другие решения

TL; DR: да, это в стеке.


Более длинная история:

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 ++, но в этом нет необходимости, поэтому никто не беспокоится.

Итак, в заключение: да, std::array находится в стеке.

16

По вопросам рекламы [email protected]