C ++ 14プレゼントstd::dynarray
:
std :: dynarrayは、構築時に固定され、オブジェクトの存続期間を通じて変更されないサイズの配列をカプセル化するシーケンスコンテナです。
std::dynarray
と同じように実行時に割り当てる必要がありますstd::vector
。
では、より動的な(そしてサイズ変更std::dynarray
可能な)使用できる一方で、どのような利点と使用法がありstd::vector
ますか?
C ++ 14プレゼントstd::dynarray
:
std :: dynarrayは、構築時に固定され、オブジェクトの存続期間を通じて変更されないサイズの配列をカプセル化するシーケンスコンテナです。
std::dynarray
と同じように実行時に割り当てる必要がありますstd::vector
。
では、より動的な(そしてサイズ変更std::dynarray
可能な)使用できる一方で、どのような利点と使用法がありstd::vector
ますか?
std::valarray
と改称std::dynarray
?std::dynarray
サイズを変更できない場合、どのように動的になりますか?
valarray
。それの動的配列の長さは、実行時の値であるので、それはコンパイル時に知られていることを必要としない、とは違ってstd::array
dynarray
いくつかの重大な技術的問題があるため、C ++ 14から削除され、将来の技術仕様(TR1の新しいバージョンと考えてください)に入れられたことに注意してください。
回答:
では
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 ++委員会会議でstd::dynarray
、C ++ 14からプルしstd::experimental::dynarray
、ランタイムバウンド(ARB、類似これは、std::dynarray
ほぼ確実にC ++ 14には含まれないことを意味します。
dynarray
野生で。何かが標準化の対象になる前に、既存のプラクティスの2つの独立した実装が必要だといつも思っていました。
dynarray
。実装の経験は非常に便利ですが、それを必要とする決まったルールはありません(ただし、あるべきだと言う人もいます!)
あなた自身を言ったように、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構文」を使用)。そのため、アロケーターが使用されたかどうかを照会することはできません。使用されていないためです。