45

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

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

繰り返しになりますが、なぜ C++14 は実行時サイズの配列と の両方を必要とするのstd::dynarrayでしょうか? よりリッチな (STL 化された) インターフェースを備えていることを考えると、同等のランタイム効率で実装できるとstd::dynarray仮定して、なぜランタイム サイズの配列をドロップしないのでしょうか?std::dynarray

明確化

「ランタイム サイズの配列」について話すとき、N3639で説明されている新しい C++14 コア言語機能について言及していて、従来の C 配列や VLA、または C++11 の何かについて言及しているのではありません。

4

3 に答える 3

2

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

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

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

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

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

于 2013-06-27T22:01:21.570 に答える
2

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

于 2013-06-27T22:01:54.427 に答える