C99 VLA を使用するのは良い考えでしょうか? malloc/free と比較して、VLA を使用するのが適切なのはいつですか? (VLA はスタックを破壊する可能性があるため)
ベストアンサー1
はい、スタックが爆発する可能性がある場合を除きます。必要に応じてスタックのサイズを変更することもできます。OS ごとに方法が異なりますが、可能です。VLA の利点は次のとおりです。
高速: スタック ポインターやフレーム ポインターの調整はいずれにせよ実行されるため、VLA のコストはほぼ 0 です。
簡単: 定義がシンプルで、初期化するポインターや解放するチェックが不要、メモリ リークのリスクもありません。
各スレッドが独自のスタックを持つため、自動的にスレッドセーフになります。 を使用するときに発生する可能性がある問題の 1 つであるロックが不要なため、スケーリングも向上します
malloc/free
。読みやすい: 非常にシンプルなコンセプトなので、微妙なバグが発生する可能性が低くなります。
いくつかの欠点があります:
サイズ制限: すでに述べたように、スタックが爆発する可能性があります。
バッファ オーバーフローは、ヒープ メモリの場合よりも少し深刻です (クラッシュするアプリケーションの方が、データを黙って破壊し、最終的に無関係な命令でクラッシュするアプリケーションよりも優れているため、これは利点であると主張する人もいます)。
移植性: すべてのコンパイラがこれを実装しているわけではありませんが、多くの場合、シミュレートできます
alloca
(注意: セマンティクスは少し異なりますが、それほど深刻なものではありません)。