この質問を見てください:なぜC / C ++コンパイラはコンパイル時に配列のサイズを知る必要があるのですか?コンパイラの実装者は、今(10年前のC99標準の一部です)足を濡らして効率的な実装を提供する必要があったはずです。
しかし、それでも(回答から)コストがかかると考えられているようです。
これはどういうわけか私を驚かせます。
もちろん、パフォーマンスの点では静的オフセットの方が動的オフセットよりもはるかに優れていることを理解しています。1つの提案とは異なり、実際にはコンパイラに配列のヒープ割り当てを実行させることはありません。測定された;)]
しかし、私はまだ想定されるコストに驚いています:
- 関数にVLAがない場合、私が見る限り、コストはかかりません。
- 単一のVLAがある場合は、すべての変数の前または後に配置できるため、ほとんどのスタックフレームの静的オフセットを取得できます(または、私には思えますが、スタック管理に精通していません)。
もちろん、複数のVLAから問題が発生しますが、専用のVLAスタックが機能するかどうか疑問に思いました。これは、VLAがカウントとポインタ(したがって既知のサイズ)で表され、セカンダリスタックで使用される実際のメモリがこの目的でのみ使用されることを意味します(したがって、実際にはスタックも)。
【言い換え】
VLAはgcc/VC ++でどのように実装されていますか?
コストは本当に印象的ですか?
[言い換えを終了]
vector
動的割り当てのコストが発生しないため(サイズ変更できないという犠牲を払って)、現在の実装でも、たとえば、を使用するよりも優れているように思われます。
編集:
ここには部分的な応答がありますが、VLAを従来のアレイと比較することは不公平に思えます。サイズを事前に知っていれば、VLAは必要ありません。同じ質問で、AndreyTは実装に関していくつかの指針を示しましたが、私が望むほど正確ではありません。