Является std::array<int,10>
(без меня, используя new
) гарантированно будет выделено в стеке, а не в куче C ++ — Standard?
Чтобы быть понятным, я не имею в виду new std::array<int, 10>
, Мне в основном интересно, разрешено ли использовать стандартную библиотеку new
внутри его реализации.
Я не мог найти более четкий ответ в стандарте, но [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
функции, где динамическое размещение не допускается.
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
находится в стеке.