web-dev-qa-db-ja.com

std :: array <>は、スタック上でのみ割り当てを保証しますか?

std::array<int,10>(自分でnewを使用しない場合)は、C++標準によってヒープではなくスタックに割り当てられることが保証されていますか?

明確にするために、私はnew std::array<int, 10>。標準ライブラリがその実装内でnewを使用することを許可されている場合、私は主に疑問に思います。

29
towi

私は標準でより明確な答えを見つけることができませんでしたが、 [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を補完します。

17
LogicStuff

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はスタック上にあります。