(背景:CおよびC ++コンパイラーの実装経験があります。)
C99の可変長配列は、基本的には失敗したものです。VLAをサポートするために、C99は次の譲歩を常識にしなければなりませんでした:
sizeof x
常にコンパイル時定数ではなくなりました。コンパイラーはsizeof
、実行時に-式を評価するコードを生成する必要がある場合があります。
2次元VLA(int A[x][y]
)を許可するには、2D VLAをパラメーターとして取る関数を宣言するための新しい構文が必要でした:void foo(int n, int A[][*])
。
C ++の世界ではそれほど重要ではありませんが、組み込みシステムプログラマーのCの対象読者にとって非常に重要です。VLAを宣言することは、スタックの任意の大きなチャンクを選択することを意味します。これは保証されたスタックオーバーフローとクラッシュです。(あなたが宣言いつはint A[n]
、あなたが「知っていれば、あなたは暗黙のうちにあなたがスペアに、スタックの2ギガバイトを持っていると主張している。結局、n
ここでは間違いなく1000未満である」、そしてあなただけ宣言しますint A[1000]
。32ビット整数を代入n
するためには1000
入場ですあなたはあなたのプログラムの振る舞いがどうあるべきかを知らないということです。)
では、C ++の話に移りましょう。C ++では、「型システム」と「値システム」はC89と同じように強力に区別されていますが、Cにはない方法で実際に依存し始めています。例えば:
template<typename T> struct S { ... };
int A[n];
S<decltype(A)> s; // equivalently, S<int[n]> s;
n
コンパイル時の定数ではない場合(つまり、A
可変的に変更された型の場合)、その型はS
いったい何なのでしょうか。うS
の型も唯一の実行時に決定すること?
これはどうですか:
template<typename T> bool myfunc(T& t1, T& t2) { ... };
int A1[n1], A2[n2];
myfunc(A1, A2);
コンパイラは、のインスタンス化のためのコードを生成する必要がありますmyfunc
。そのコードはどのように見えるべきですか?タイプがわからない場合、どのようにしてそのコードを静的に生成できますか?A1
コンパイル時にますか?
さらに悪いことに、何それは実行時に判明した場合、そのn1 != n2
ように、!std::is_same<decltype(A1), decltype(A2)>()
?その場合、への呼び出しはコンパイルするmyfunc
べきではありませんテンプレートタイプの推定は失敗するため、であってはなりません!実行時にその動作をどのようにエミュレートできますか?
基本的に、C ++は、テンプレートコードの生成、関数の評価など、コンパイル時の決定をますますプッシュする方向に向かっconstexpr
ています。その間、C99は従来のコンパイル時の決定(たとえばsizeof
)をランタイムにプッシュするのに忙しかった。これを念頭に置いて、C99スタイルのVLAをC ++に統合しようとするあらゆる努力を費やすことは本当に意味がありますか?
他のすべての回答者がすでに指摘したように、C ++は、「必要なRAMの容量がわからない」という考えを本当に伝えたいときに、多くのヒープ割り当てメカニズム(std::unique_ptr<int[]> A = new int[n];
またはstd::vector<int> A(n);
明らかなメカニズム)を提供します。また、C ++は、必要なRAMの量がRAMの量よりも多いという避けられない状況に対処するための、優れた例外処理モデルを提供します。しかし、うまくいけば、この回答は、C99スタイルのVLAがC ++に適さなかった理由、およびC99に実際には適さなかった理由についての良い考えを提供します。;)
このトピックの詳細については、VLAに関するBjarne Stroustrupの2013年10月の論文、N3810「Alternatives for Array Extensions」を参照してください。BjarneのPOVは私のものとは非常に異なります。N3810は、物事に適したC ++風の構文を見つけることに重点を置き、C ++ で生の配列を使用しないようにすることに重点を置いていますが、メタプログラミングと型システムへの影響に重点を置いています。彼がメタプログラミング/タイプシステムの影響を解決、解決可能、または単に興味がないと見なしているかどうかはわかりません。
これらと同じ点の多くに当てはまる優れたブログ投稿は、「可変長配列の正当な使用」(Chris Wellons、2019-10-27)です。