ドラフトC++ 14には、ランタイムサイズの配列とstd::dynarray
コンテナーの両方が含まれています。私が知ることができることから、2つの間の唯一の本当の違いは、std::dynarray
にSTLインターフェイスがあることです(たとえば、begin
、end
、size
など)。 )、実行時サイズの配列にはありません。では、なぜC++ 14では両方が必要なのでしょうか。
ランタイムサイズの配列はコア言語の一部であり、std::dynarray
は標準ライブラリの一部であることを理解していますが、 std::dynarray
の提案は、作成者がコンパイラを期待していることを明確にします、多くの場合、std::dynarray
に特別なサポートを提供して、可能な限り効率的になるようにします。つまり、実行時サイズの配列と同じくらい効率的にします。そのため、言語/ライブラリの区別はやや人工的なもののようです。
では、なぜC++ 14はランタイムサイズの配列とstd::dynarray
の両方が必要なのでしょうか。そして、std::dynarray
がよりリッチな(STLified)インターフェースを持っていることを考えると、std::dynarray
が同等のランタイム効率で実装できると仮定して、ランタイムサイズの配列を単にドロップしないのはなぜですか?
説明
「ランタイムサイズの配列」について話すとき、私は N3639 で説明されている新しいC++ 14コア言語機能を指しています。 11。
N3639 は、自動ストレージ期間を持つローカルランタイムサイズの配列をC++に追加することを提案します。
N2648 は、C++の慣習に従って、std::dynarray
sは、自動変数以外にも使用できます。しかし、効率的なスタック割り当てを利用するために、自動変数として使用する場合はdynarray
を最適化可能にしたいと考えています。
要するに、C11スタイルのランタイムサイズの配列は、スタックに格納されることに制限されています。 dynarray
はそうではありませんが、スタックに格納するときに最適化して、C11スタイルのランタイムサイズの配列と同じくらい効率的にすることができます(または目標です)。
C11スタイルのランタイムサイズの配列は依然として有用な構文であり、Cとの相互コンパイル性を高めるためのコストは高くありません。効率的な自動dynarray
を実現するには、メカニズムを実装する必要があります。さらに、C11スタイルのランタイムサイズの配列はファーストクラスシチズンであり、プログラマーによるstd
ライブラリの使用に関係なく存在します。
実際のC11ランタイムサイズの配列とC++ 1y C11スタイルのランタイムサイズの配列には重要な違いがあります。少なくとも、実際のC11ランタイムサイズの配列がサポートするランタイムsizeof
は重要です。しかし、それの基本的な使用は互換性があるかもしれません。
最後に、C++ 14でneverが追加されていることに注意してください。
あなた自身が言ったように、std::dynarray
はSTLスタイルのインターフェースを提供します。これにより、より慣用的に使用できます。それでも、C++ではnew[]
を使用して作成された動的配列が必要です。
std::dynarray
を実装してください(したがって、new []なしでdynarrayを作成することはできません)New []を使用するすべてのコードが間違っているとは言えません。
一般的に、C++ 14 std::dynarray
配列とC++ new[]
配列の違いは、C++ 11 std::array
とCスタイルの配列の違いとほとんど同じです。
UPD:これで、C11(VLA)に類似した機能について質問されているようです。実際にはそれとは何の関係もありません-VLAは非常に制限されており、配列サイズとして使用できるのは関数の引数のみです。また、メモリはスタックに割り当てられますが、std::dynarray
のメモリはヒープに割り当てられます。基本的に、この機能はCスタイルの配列をもう少し拡張し、C++を最新のC標準との互換性を高めます。
自分で質問に答えたと思います、std::dynarray
にはstlインターフェースがあります。 c ++ 11の目標であり、c ++ 14はc ++をよりユーザーフレンドリーにし、エラーが発生しにくく、初心者にとって簡単にすることを想定しています。 Cスタイルの配列を使用すると、ポインター算術の問題が発生する可能性がありますが、dynarray
は意図したとおりに使用すると問題を回避します
編集:1つの違いは、ランタイムサイズの配列をスタックに割り当てる必要があるため、スタックオーバーフローの可能性が高くなることです。 dynarray
はヒープに割り当てられますが、スタックに割り当てることは可能です(実装で割り当てられている場合)。