web-dev-qa-db-ja.com

C ++ 14でランタイムサイズの配列とstd :: dynarrayの両方を使用する理由

ドラフトC++ 14には、ランタイムサイズの配列とstd::dynarrayコンテナーの両方が含まれています。私が知ることができることから、2つの間の唯一の本当の違いは、std::dynarrayにSTLインターフェイスがあることです(たとえば、beginendsizeなど)。 )、実行時サイズの配列にはありません。では、なぜC++ 14では両方が必要なのでしょうか。

ランタイムサイズの配列はコア言語の一部であり、std::dynarrayは標準ライブラリの一部であることを理解していますが、 std::dynarray の提案は、作成者がコンパイラを期待していることを明確にします、多くの場合、std::dynarrayに特別なサポートを提供して、可能な限り効率的になるようにします。つまり、実行時サイズの配列と同じくらい効率的にします。そのため、言語/ライブラリの区別はやや人工的なもののようです。

では、なぜC++ 14はランタイムサイズの配列とstd::dynarrayの両方が必要なのでしょうか。そして、std::dynarrayがよりリッチな(STLified)インターフェースを持っていることを考えると、std::dynarrayが同等のランタイム効率で実装できると仮定して、ランタイムサイズの配列を単にドロップしないのはなぜですか?

説明

「ランタイムサイズの配列」について話すとき、私は N3639 で説明されている新しいC++ 14コア言語機能を指しています。 11。

45

N3639 は、自動ストレージ期間を持つローカルランタイムサイズの配列をC++に追加することを提案します。

N2648 は、C++の慣習に従って、std::dynarraysは、自動変数以外にも使用できます。しかし、効率的なスタック割り当てを利用するために、自動変数として使用する場合はdynarrayを最適化可能にしたいと考えています。

要するに、C11スタイルのランタイムサイズの配列は、スタックに格納されることに制限されています。 dynarrayはそうではありませんが、スタックに格納するときに最適化して、C11スタイルのランタイムサイズの配列と同じくらい効率的にすることができます(または目標です)。

C11スタイルのランタイムサイズの配列は依然として有用な構文であり、Cとの相互コンパイル性を高めるためのコストは高くありません。効率的な自動dynarrayを実現するには、メカニズムを実装する必要があります。さらに、C11スタイルのランタイムサイズの配列はファーストクラスシチズンであり、プログラマーによるstdライブラリの使用に関係なく存在します。

実際のC11ランタイムサイズの配列とC++ 1y C11スタイルのランタイムサイズの配列には重要な違いがあります。少なくとも、実際のC11ランタイムサイズの配列がサポートするランタイムsizeofは重要です。しかし、それの基本的な使用は互換性があるかもしれません。

最後に、C++ 14でneverが追加されていることに注意してください。

あなた自身が言ったように、std::dynarrayはSTLスタイルのインターフェースを提供します。これにより、より慣用的に使用できます。それでも、C++ではnew[]を使用して作成された動的配列が必要です。

  1. 少なくともstd::dynarrayを実装してください(したがって、new []なしでdynarrayを作成することはできません)
  2. 以前のバージョンとの互換性を維持する

New []を使用するすべてのコードが間違っているとは言えません。

一般的に、C++ 14 std::dynarray配列とC++ new[]配列の違いは、C++ 11 std::arrayとCスタイルの配列の違いとほとんど同じです。

UPD:これで、C11(VLA)に類似した機能について質問されているようです。実際にはそれとは何の関係もありません-VLAは非常に制限されており、配列サイズとして使用できるのは関数の引数のみです。また、メモリはスタックに割り当てられますが、std::dynarrayのメモリはヒープに割り当てられます。基本的に、この機能はCスタイルの配列をもう少し拡張し、C++を最新のC標準との互換性を高めます。

2
sasha.sochka

自分で質問に答えたと思います、std::dynarrayにはstlインターフェースがあります。 c ++ 11の目標であり、c ++ 14はc ++をよりユーザーフレンドリーにし、エラーが発生しにくく、初心者にとって簡単にすることを想定しています。 Cスタイルの配列を使用すると、ポインター算術の問題が発生する可能性がありますが、dynarrayは意図したとおりに使用すると問題を回避します
編集:1つの違いは、ランタイムサイズの配列をスタックに割り当てる必要があるため、スタックオーバーフローの可能性が高くなることです。 dynarrayはヒープに割り当てられますが、スタックに割り当てることは可能です(実装で割り当てられている場合)。

2
aaronman