web-dev-qa-db-ja.com

std :: dynarray vs std :: vector

C++ 14は std::dynarray を提示します:

std :: dynarrayは、構築時に固定され、オブジェクトの存続期間を通じて変化しないサイズの配列をカプセル化するシーケンスコンテナーです。

std::dynarrayは、std::vectorと同じように実行時に割り当てる必要があります。

では、std::dynarrayの利点と使用法はどのようなものですが、std::vectorを使用すると、より動的(およびサイズ変更可能)になりますか?

81
deepmax

では、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にはほとんど確実に含まれないことを意味します。

81
Jonathan Wakely

あなたが言ったように、_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の答えは、はるかに権威があり、洞察力に富んでいます。

31
Kerrek SB