C++ 14は std::dynarray
を提示します:
std :: dynarrayは、構築時に固定され、オブジェクトの存続期間を通じて変化しないサイズの配列をカプセル化するシーケンスコンテナーです。
std::dynarray
は、std::vector
と同じように実行時に割り当てる必要があります。
では、std::dynarray
の利点と使用法はどのようなものですが、std::vector
を使用すると、より動的(およびサイズ変更可能)になりますか?
では、
std::dynarray
を使用すると、より動的な(サイズ変更可能)std::vector
の利点と使用法は何でしょうか?
dynarray
は、個別のサイズと容量の値を管理する必要がなく、アロケータを保存する必要がないため、vector
よりも小さくシンプルです。
ただし、パフォーマンスの主な利点は、可能な場合はヒープ割り当てを避けて、スタックにdynarray
を割り当てることが推奨されるという事実から得られることを意図しています。例えば.
std::dynarray<int> d(5); // can use stack memory for elements
auto p = new std::dynarray<int>(6); // must use heap memory for elements
この最適化には、コンパイラーの協力が必要であり、純粋なライブラリー型として実装することはできません。また、必要なコンパイラーの魔法は実装されておらず、誰でも簡単に実行できるかはわかりません。実装の経験がないため、先週シカゴで開催されたC++委員会で、C++ 14からstd::dynarray
を引き出し、std::experimental::dynarray
とランタイムバウンド(ARB)の配列を定義する別の配列拡張TS(技術仕様)ドキュメントを発行することが決定されました、C99 VLAと同様です。)これは、std::dynarray
がC++ 14にはほとんど確実に含まれないことを意味します。
あなたが言ったように、_std::dynarray
_はfixed-size動的配列用です。サイズ変更はできません。大まかに言って、_new T[N]
_とstd::unique_ptr<T[]>(new T[N])
の改善です。
容量のサイズを変更したり管理したりする必要がないということは、データ構造をより複雑で少ないスペースで実装できるということです。
さらに、_std::dynarray
_は奇妙な動物であり、実装がさまざまな非特定の方法で実装できるようにします。スタックに配列を配置することが可能です。割り当て関数の呼び出しは「オプション」です。アロケータを指定して配列の要素を構築できますが、それは型の一部ではありません。
また、なぜ_std::dynarray
_and可変長配列が必要か疑問に思うかもしれません。 C++ 14のVLAははるかに制限的です。ローカルの自動変数のみであり、割り当てポリシーを指定する方法は提供されません。もちろん、標準のコンテナインターフェイスはありません。
「現在のドラフト」の23.3.4.2からのいくつかの例(それを、Googleキャッシュ):
_explicit dynarray(size_type c);
_効果:
c
要素にストレージを割り当てます。 グローバル_operator new
_を呼び出す場合と呼び出さない場合があります
_template <class Alloc> dynarray(size_type c, const Alloc& alloc);
_効果:各要素はuses-allocator構築で構築されますを除いて、前述のコンストラクタと同等です。
あなたがcan特定のアロケータを使用して配列要素を構築するかどうかは、グローバルな特性です:
テンプレート構造体uses_allocator、Alloc>:true_type {};
要件:
Alloc
はアロケータ(17.6.3.5)でなければなりません。 [注:この特性の特殊化は、dynarray
がアロケーターを使用して構築できることを他のライブラリコンポーネントに通知します。ネストされたallocator_type。]
編集: Jonathan Wakelyの答えは、はるかに権威があり、洞察力に富んでいます。