20

C99 VLA を使用するのは良い考えですか? malloc/free と比較して VLA を使用するのが適切なのはどのような場合ですか? (VLAがスタックを爆破するかもしれないので?)

4

6 に答える 6

28

はい、スタックが爆発する可能性があることがわかっている場合を除きます。必要に応じてスタックのサイズを変更することもできます。OS ごとに方法は異なりますが、可能です。VLA の利点は次のとおりです。

  • 高速 : スタック ポインターおよび/またはフレーム ポインターの調整はとにかく行われるため、VLA のコストはほぼ 0 です。

  • 簡単 : 簡単な定義、初期化するためのポインターなし、解放を確認するため、メモリ リークのリスクなし。

  • 各スレッドには独自のスタックがあるため、自動的にスレッドセーフになります。を使用するときに発生する可能性がある 1 つの問題であるロックの必要がないため、スケーリングも優れていますmalloc/free

  • 読みやすい : これは本当に単純な概念であるため、微妙なバグが発生する可能性は低くなります。

いくつかの欠点があります。

  • サイズ制限 : 既に述べたように、スタックが爆発する可能性があります。

  • バッファ オーバーフローは、ヒープ メモリ上よりも少し深刻です (クラッシュするアプリケーションは、静かにデータを破壊し、最終的に無関係な命令でクラッシュするよりも優れているため、利点であると主張できます)。

  • 移植性 : すべてのコンパイラが実装しているわけではありませんが、多くの場合、シミュレートできますalloca(注意: セマンティックは少し異なりますが、それほど深刻なものではありません)。

于 2010-06-21T05:28:17.807 に答える
3

スタック割り当ての主な利点は、割り当てられた可変長配列の自動メモリ管理が可能になることです。メモリ管理はCプログラムの主要な課題の1つであるため、可能であれば、VLAを使用してタスクを簡素化する必要があります。

次に、可能な場合はVLAを一貫して使用する必要があります。それ以外の場合は、次の場合にのみmallocを使用する必要があります。ストレージの期間を制御する必要がある場合、割り当てが非常に多い場合、およびメモリ不足を処理する場合優雅にエラー。

于 2010-06-21T05:12:24.443 に答える
2

C++ は VLA をサポートしていません。そのため、必要に応じて、コードを C++ に移植するのに少し手間がかかります。

繰り返しになりますが、これは実際には良いことだと信じて、c のシンボルの素晴らしい名前として「クラス」を狡猾に提案する人もいます :-)

于 2010-06-21T09:13:35.950 に答える
0

C99 関連のリンク (可変長配列に関する情報へのリンクを含む) の適切なリストについては、以下を参照してください。

Xcode はデフォルトで C99 を使用するようになりました - C99 とは何ですか?

http://lists.apple.com/archives/xcode-users/2008/May/msg00665.html

于 2010-06-21T06:03:58.190 に答える