std::array<int,10>
(自分でnew
を使用しない場合)は、C++標準によってヒープではなくスタックに割り当てられることが保証されていますか?
明確にするために、私はnew std::array<int, 10>
。標準ライブラリがその実装内でnew
を使用することを許可されている場合、私は主に疑問に思います。
私は標準でより明確な答えを見つけることができませんでしたが、 [array.overview]/2
:
配列は集合体(
[dcl.init.aggr]
)。これは、型がN
に変換可能な最大T
要素でリスト初期化できます。
そして [dcl.init.aggr]/1
:
集合体は配列またはクラスです(句
[class]
)with
- ユーザー提供なし、明示的、または継承constructors(
[class.ctor]
)、...
それについて説明します。アグリゲートがメモリを動的に割り当てることはできません(または、構築中にそれ自体で何かを行うことはできません)。暗黙的に宣言された単純なコンストラクターのみがあります。
もちろん、new std::array<...>
を使用すると、「ヒープ」に配列を取得できます。
cppreference で得られるものに満足する人もいます。
std::array
は、固定サイズの配列をカプセル化するコンテナです。このコンテナは、Cスタイルの配列
T[N]
を唯一の非静的データメンバーとして保持する構造体と同じセマンティクスを持つ集約型です。
第三に、std::array
はC++ 11で導入されました。どうして?たとえば、動的割り当てが許可されていないconstexpr
関数での使用など、いくつかの方法でstd::vector
を補完します。
TL; DR:はい、スタック上にあります。
長い話:
C++には、スタックまたはヒープの概念はありません。これらは実装の詳細であり、従来のスタックを使用しないプラットフォームが少なくとも1つあります(むしろ、ヒープ割り当てのリンクリスト)。
自動ストレージと無料ストアがあります。 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
はスタック上にあります。