1. ホーム
  2. c++

[解決済み】なぜ可変長配列はC++の標準に含まれないのですか?

2022-04-29 21:10:50

質問

ここ数年、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の一部にはならないようです。