std :: dynarray vs std :: vector


84

C ++ 14プレゼントstd::dynarray

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

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

では、より動的な(そしてサイズ変更std::dynarray可能な)使用できる一方で、どのような利点と使用法がありstd::vectorますか?


1
ねえ、「C ++ 14」はいつからタグですか?私は先日それを探していましたが、それは存在しませんでした...
Kerrek SB 2013

1
されるstd::valarrayと改称std::dynarraystd::dynarrayサイズを変更できない場合、どのように動的になりますか?
yasouser 2013年

9
@yasouser、いいえ、それはとは何の関係もありませんvalarray。それの動的配列の長さは、実行時の値であるので、それはコンパイル時に知られていることを必要としない、とは違ってstd::array
ジョナサンWakely

21
先週のC ++標準委員会の会議で、dynarrayいくつかの重大な技術的問題があるため、C ++ 14から削除され、将来の技術仕様(TR1の新しいバージョンと考えてください)に入れられたことに注意してください。
ピートベッカー

2
dynarrayはドラフトC ++ 14の一部ではなくなりました
cassinaj 2015

回答:


89

ではstd::dynarraystd::vectorより動的な(サイズ変更可能な)使用できる場合の利点と使用法は何ですか?

dynarrayvector、サイズと容量の値を個別に管理する必要がなく、アロケーターを格納する必要がないため、より小さくて単純です。

ただし、主なパフォーマンス上の利点は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 ++委員会会議でstd::dynarray、C ++ 14からプルしstd::experimental::dynarray、ランタイムバウンド(ARB、類似これは、std::dynarrayほぼ確実にC ++ 14には含まれないことを意味します。


1
あった場合にはグレートは、私は思っていた任意の非自明な実装がdynarray野生で。何かが標準化の対象になる前に、既存のプラクティスの2つの独立した実装が必要だといつも思っていました。
Kerrek SB 2013

いいえ、スタック割り当ての既知の実装はありませんdynarray。実装の経験は非常に便利ですが、それを必要とする決まったルールはありません(ただし、あるべきだと言う人もいます!)
Jonathan Wakely 2013年

ここでブレインストーミングをしますが、std :: dynarray make_dyn_autostorage(int)とstd :: dynarray make_dyn_heap(int)の2つの関数を作成するのはどうですか?
Laurijssenサーブ

2
@KerrekSB、はい、シカゴでのライブラリモーション10は次のとおりです。「計画されたアレイ拡張TSのワーキングペーパーを作成し、2つのペーパーN3639によってC ++ 14CDに適用された編集を削除します。」自動のランタイムサイズのアレイストレージ期間(リビジョン5) " N3662、" C ++ Dynamic Arrays(dynarray) "および、Array Extensions TSプロジェクトエディタに、これらの単語を最初のコンテンツとしてArrayExtensionsワーキングペーパーに適用するように指示します。"
Jonathan Wakely 2013年

3
@ h9uestは「C ++の人」とは関係ありません。これらはISO技術委員会の成果物の正式名称です。iso.org / iso /
Jonathan Wakely 2015

31

あなた自身を言ったように、std::dynarrayのためである固定サイズの動的配列。サイズ変更はできません。大まかに言って、何度new T[N]も何度も改善されていstd::unique_ptr<T[]>(new T[N])ます。

容量のサイズ変更や管理が不要なため、より少ない複雑さと少ないスペースでデータ構造を実装できます。

さらに、これstd::dynarrayは、実装がさまざまな非特定の方法で実装できるようにする奇妙な動物です。たとえば、配列をスタックに配置することが可能です。割り当て関数の呼び出しは「オプション」です。配列の要素を構築するためにアロケーターを指定できますが、それは型の一部ではありません。

私たちが必要とする理由あなたはまた、疑問に思うかもしれませんstd::dynarray し、可変長配列。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構文で構築されることを除いて、前述のコンストラクターと同等です。

特定のアロケータを使用して配列要素を構築できるかどうかは、グローバルな特性です。

テンプレート構造体uses_allocator、Alloc>:true_type {};

必要なもの: Allocアロケーター(17.6.3.5)である必要があります。[注:このトレイトを特殊dynarray化すると、ネストされたallocator_typeがなくても、アロケーターを使用して構築できる他のライブラリコンポーネントに通知されます。]

編集:ジョナサン・ウェイクリーの答えは、はるかに権威があり、洞察に満ちているはずです。


アロケーターをdynarrayのコンストラクターに渡すことは、割り当てに使用されることはなく、要素のコンストラクターへの引数としてのみ使用されます(「uses-allocator構文」を使用)。そのため、アロケーターが使用されたかどうかを照会することはできません。使用されていないためです。
Jonathan Wakely 2013年

@JonathanWakely:ああ、私はそれを誤解しました。ありがとう、修正しました!
Kerrek SB 2013
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.