[解決済み】なぜ可変長配列はC++の標準に含まれないのですか?
質問
ここ数年、C言語をあまり使っていない。私が読むと この質問 今日、見慣れないC言語の構文に出くわしました。
どうやら C99 の場合、以下の構文が有効です。
void foo(int n) {
int values[n]; //Declare a variable length array
}
これはかなり便利な機能のようですね。C++の標準に追加しようという議論はあったのでしょうか?あったのなら、なぜ省略されたのでしょうか?
考えられる理由はいくつかあります。
- コンパイラベンダが実装するのは難しい
- 標準の他の部分と互換性がない
- 他のC++コンストラクトで機能をエミュレートすることができる
C++の規格では、配列のサイズは定数式でなければならないとされています(8.3.4.1)。
もちろん、このおもちゃのような例では
std::vector<int> values(m);
しかし、この場合、メモリはスタックではなくヒープから確保されます。そして、もし私が多次元配列のようなものが欲しいなら。
void foo(int x, int y, int z) {
int values[x][y][z]; // Declare a variable length array
}
その
vector
のバージョンがかなり不格好になります。
void foo(int x, int y, int z) {
vector< vector< vector<int> > > values( /* Really painful expression here. */);
}
また、スライス、行、列は潜在的にメモリ上に散在することになります。
での議論を見ると
comp.std.c++
この問題は、両陣営に大物がいて、かなり議論を呼んでいることは明らかです。確かに
std::vector
が常にベターな解決策である。
どのように解決するのですか?
最近、この件に関する議論がusenetでキックオフされたんだ。 C++0xでVLAがない理由 .
私は、通常わずかなスペースしかないスタック上に大きな配列の候補を作らなければならないのは良くないということに同意しているような人たちに賛成です。あらかじめサイズがわかっているのであれば、静的配列を使えばいいという主張です。そして、もしサイズが事前に分からない場合は、安全でないコードを書くことになります。
C99 VLA は、スペースを無駄にしたり、未使用の要素のためにコンストラクタを呼び出すことなく小さな配列を作成できるという小さな利点を提供することができますが、型システムにかなり大きな変更をもたらすでしょう(実行時の値に応じて型を指定できる必要があります - これは現在の C++ にはまだ存在しません、例外として、C99 VLA は実行時の値に応じて型を指定できます)。
new
演算子の型指定子ですが、これは特別に扱われ、実行時らしさのスコープが
new
演算子)。
を使用することができます。
std::vector
動的メモリを使用するため、独自のスタックアロケータを使用するのは簡単ではありません(アライメントも問題です)。また、VLAが固定サイズであるのに対し、ベクターはサイズ変更可能なコンテナであるため、同じ問題を解決することはできません。そのため
C++ダイナミックアレイ
この提案は、言語ベースのVLAに代わる、ライブラリベースのソリューションを導入することを意図しています。しかし、私が知る限り、これはC++0xの一部にはならないようです。
関連
-
[解決済み] error: 'ostream' does not name a type.
-
[解決済み】 while(cin) と while(cin >> num) の違いは何ですか?)
-
[解決済み] なぜテンプレートはヘッダーファイルでしか実装できないのですか?
-
[解決済み] なぜ、オブジェクトそのものではなく、ポインタを使用しなければならないのですか?
-
[解決済み] 配列の場合、なぜ a[5] == 5[a] になるのでしょうか?
-
[解決済み] template "と "typename "キーワードはどこに、なぜ入れなければならないのですか?
-
[解決済み] JavaScriptで2つの配列の差を取得する方法は?
-
[解決済み] Pythonで配列の長さを取得するには、arr.__len__()が好ましいですか?
-
[解決済み] 配列の長さを求めるにはどうしたらよいですか?
-
[解決済み] 現在のCまたはC++の標準文書はどこにありますか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] テスト
-
[解決済み】Visual Studio 2015で「非標準の構文。'&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み】C++でユーザー入力を待つ【重複あり
-
[解決済み】C++エラーです。"配列は中括弧で囲まれたイニシャライザーで初期化する必要がある"
-
[解決済み】抽象クラス型の無効なnew-expression
-
[解決済み】Visual Studio 2013および2015でC++コンパイラーエラーC2280「削除された関数を参照しようとした」が発生する
-
[解決済み】リンカーエラーです。"リンカ入力ファイルはリンクが行われていないため未使用"、そのファイル内の関数への未定義参照
-
[解決済み] [Solved] インクルードファイルが開けません。'stdio.h' - Visual Studio Community 2017 - C++ Error
-
[解決済み】浮動小数点数の乱数生成
-
[解決済み] 配列のベクトルを扱う正しい方法