問題タブ [variable-length-array]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 可変長配列がC++標準の一部ではないのはなぜですか?
ここ数年、Cはあまり使用していません。今日この質問を読んだとき、私はよく知らないC構文に出くわしました。
どうやらC99では次の構文が有効です:
これはかなり便利な機能のようです。それをC++標準に追加することについての議論はありましたか?もしそうなら、なぜそれが省略されたのですか?
いくつかの潜在的な理由:
- コンパイラベンダーが実装するのは難しい
- 標準の他の部分と互換性がありません
- 機能は他のC++構造でエミュレートできます
C ++標準では、配列サイズは定数式でなければならないと規定されています(8.3.4.1)。
はい、もちろん、おもちゃの例ではを使用できることを理解していstd::vector<int> values(m);
ますが、これはスタックではなくヒープからメモリを割り当てます。そして、次のような多次元配列が必要な場合:
vector
バージョンはかなり不器用になります:
スライス、行、および列も、メモリ全体に分散される可能性があります。
での議論を見ると、comp.std.c++
この質問はかなり物議を醸していることが明らかであり、議論の両側にいくつかの非常に重い名前があります。std::vector
aが常により良い解決策であることは確かに明らかではありません。
c - 可変長配列を使用するためのオーバーヘッドはありますか?
可変長配列を使用するオーバーヘッドはありますか? 実行時にコマンドライン引数を介して配列のサイズを渡すことはできますか? 配列の自動および動的割り当てと比較して、なぜそれが導入されたのですか?
c - C コンパイル エラー:「可変サイズ オブジェクトが初期化されていない可能性があります」
次のコードで「可変サイズ オブジェクトが初期化されていない可能性があります」というエラーが表示されるのはなぜですか?
c++ - C ++での可変長配列のオーバーヘッド?
この質問を見てください:なぜC / C ++コンパイラはコンパイル時に配列のサイズを知る必要があるのですか?コンパイラの実装者は、今(10年前のC99標準の一部です)足を濡らして効率的な実装を提供する必要があったはずです。
しかし、それでも(回答から)コストがかかると考えられているようです。
これはどういうわけか私を驚かせます。
もちろん、パフォーマンスの点では静的オフセットの方が動的オフセットよりもはるかに優れていることを理解しています。1つの提案とは異なり、実際にはコンパイラに配列のヒープ割り当てを実行させることはありません。測定された;)]
しかし、私はまだ想定されるコストに驚いています:
- 関数にVLAがない場合、私が見る限り、コストはかかりません。
- 単一のVLAがある場合は、すべての変数の前または後に配置できるため、ほとんどのスタックフレームの静的オフセットを取得できます(または、私には思えますが、スタック管理に精通していません)。
もちろん、複数のVLAから問題が発生しますが、専用のVLAスタックが機能するかどうか疑問に思いました。これは、VLAがカウントとポインタ(したがって既知のサイズ)で表され、セカンダリスタックで使用される実際のメモリがこの目的でのみ使用されることを意味します(したがって、実際にはスタックも)。
【言い換え】
VLAはgcc/VC ++でどのように実装されていますか?
コストは本当に印象的ですか?
[言い換えを終了]
vector
動的割り当てのコストが発生しないため(サイズ変更できないという犠牲を払って)、現在の実装でも、たとえば、を使用するよりも優れているように思われます。
編集:
ここには部分的な応答がありますが、VLAを従来のアレイと比較することは不公平に思えます。サイズを事前に知っていれば、VLAは必要ありません。同じ質問で、AndreyTは実装に関していくつかの指針を示しましたが、私が望むほど正確ではありません。
sql - データベースの可変長フィールド
可変長リストをSQLまたは他のデータベースエンジンのデータベースに保存する方法はありますか??
ここでリストはいいえを意味します。配列内の要素の。たとえば、数値の配列。
しかし、私の実際のアプリケーションでは、保存されるものはオブジェクトであるため、単純にカンマ区切りのリストとして保存することはできません。
java - サイズを知らずに配列を初期化するにはどうすればよいですか?
入力配列に基準を適用し、フィルタリング基準に基づいてサイズが小さくなる別の配列を出力として返す必要がある状況があります。
ここでの問題は、フィルタリングされた結果のサイズがわからないため、特定の値で配列を初期化できないことです。また、array.length; を使用しているため、値が null になる大きなサイズにはしたくありません。後で。
1 つの方法は、最初に元の入力配列をループしてカウンターを設定し、次にそのカウンター長で別のループを作成し、この配列を初期化して埋めることです[]。しかし、とにかく1回のループで仕事をすることはありますか?
python - Numpy C拡張で可変長配列を返しますか?
このサイトの大きな助けを借りて、以前にいくつかの Numpy C 拡張を作成しましたが、返されたパラメーターを見る限り、すべて固定長です。
代わりに Numpy C 拡張に可変長の numpy 配列を返す方法はありますか?
c - MS Visual C ++でVLA(可変長配列)を有効にしますか?
VLA、C99で定義されている可変長配列、MS Visual C ++での使用を有効にするにはどうすればよいですか、それともまったく不可能ですか?
はい、C ++標準はC89に基づいており、VLAはC89標準では使用できないため、C ++では使用できないことを知っていますが、MSVC ++もCコンパイラであると想定されており、/を使用してオンに切り替えることができます。 TCコンパイラパラメータ(Compile as C Code (/TC)
)。ただし、これを行うとVLAが有効にならないようで、コンパイルプロセスは失敗し、C ++(Compile as C++ Code (/TP)
)と同じエラーが発生します。たぶん、MSVC ++ CコンパイラはC89にのみ準拠しているのでしょうか、それとも何か(特別な構造またはプラグマ/定義)が不足しているのでしょうか?
コードサンプル:
コンパイルエラー:
エラーC2057:予期される定数式
エラーC2466:定数サイズ0の配列を割り当てることができません
エラーC2133:'pc':不明なサイズ
c - デスクトップ OS 上の C コンパイラは、スタック オーバーフローを検出するためにいくつのメモリ ページを使用しますか?
この質問は、C99 の可変長配列に関するこの質問に関連していますが、これとは異なります。
答えは、可変長配列 (または固定サイズの単なる大きな配列) をスタックに割り当てる際の 1 つの危険性は、たとえば、malloc
割り当てが成功したかどうかを呼び出し元に明示的に伝える を呼び出すのとは対照的に、割り当てがサイレントに失敗する可能性があることを指摘しています。
最新の非組み込みコンパイル プラットフォームは、無効なメモリ ゾーンを使用して、追加コストなしでスタック オーバーフローを検出します (チェックは、MMU によって既に無料で行われているチェックのみです)。ローカル配列が非常に大きいと、スタック ポインタが無効な領域を飛び越える可能性があるため、上記の問題を 100% 回避することはできません。
この検出に通常割り当てられるページ数を知っている人はいますか? 少なくとも 4KiB になると思いますが、それ以上になる可能性もあります。それはコンパイラーまたは OS によって選択されたものですか? どちらの場合でも、それを変更する方法はありますか?
c - mallocなしのCの動的配列?
どうすればこれを回避できるのか、私はいつも疑問に思っていました:
とにかくchar配列copy
が割り当てられ、プログラムは正常に実行され、元とコピーが出力されます。そしてヴァルグリンドは何も文句を言わない。
C では malloc なしでは動的配列は不可能だと思っていました。私は間違っていましたか?