現実世界でalloca
はどのくらい広く使用されていますか? alloca
を使用するように生徒に教える必要がありますか?それとも、絶対に使用しないように教えるべきでしょうか? C++ RAIIのバックグラウンドから来て、free
を手動で呼び出す必要がないという考えは、特に複数の出口点を持つ関数では有望に聞こえます。
一般的なCプログラミングのコースを実施している場合、それらを教えるべきではありません事これは標準にはありません。初心者プログラマーは、そのように教えられたため、不必要に非標準のコードや移植性のないコードを書く必要があり、過去20〜30年ほどの間、ソフトウェア業界にとって大きな問題でした。彼らに標準を教えないで、標準だけを教えるためのコストは、おそらく天文学的なものです。
アルゴリズムまたはアプリケーションプログラミングのより高度なコースを開催している場合は、それについて言及することをお勧めします。一方、ハードリアルタイムの組み込みアプリからWindowsアプリケーションフラッフまで、15年間、その機能を使用せずにすべてをプログラミングしてきました。
私は2つのことが起こっているのを見ることができます:
生徒はalloca
の影響を理解し、スタックとヒープの違いについて読み、alloca
を慎重に使用します。 (そうではない)
学生たちは「すごい、これはmalloc
のようにfree
を気にしないで」と思い、過度に使用し、スタックオーバーフローを起こし、何が起きているのかわからない。
alloca
について説明し、次のコードを実行すると、はるかに良いと思います。
#include <malloc.h>
int OverflowMyStack(int start) {
if (start == 0)
return 0;
char * p = (char *)_alloca(4096);
*p = '0';
return OverflowMyStack(start - 1);
}
int main () {
return OverflowMyStack(512);
}
ソース: http://www.strchr.com/alloca
危険を示してから、使用しないように伝えます。彼らはまだスタックとヒープについて学習し、動作中の危険を確認し、標準的なものに進むことができます。
この質問への答えは、最初に目的が何であるかに基づいている必要があります。
Cの書き方をプログラミングし、既存のCコードを実際に使用する方法をすでに知っている人に教えたいですか?もしそうなら、アロカとあなたが望む他のものについて教えてください。
一方、偶然にCのみを使用している入門コースを教える場合(Cは非常に小さな言語であるためなど)、重要な部分(モジュール式プログラム、サブルーチン、コレクションなどを書く)に集中する必要があります。 。)。学生の観点からすると、アロカはほとんどの場合mallocで十分であるため、冗長であり、適切なコードの観点からは、手動のメモリ管理がいらいらしている方法とother言語がこの問題を処理する結局のところ、メモリ管理にはallocaやRAIIよりも多くのことがあるので、これらに限定するべきではありません。すでに述べたように、 allocaを他の言語(またはC99 ...)で実行する他の「より標準的な」方法と比較した場合
番号。
Cプログラマーがallocaの存在を認識する必要がある唯一の理由は、それを使用しているレガシーコードを理解して修正することです。
alloca
の使用はいずれかです
私が実際の例を見つけたことのないいくつかの思考実験を除いて、alloca
(またはVLA)の使用例はありません。これは、役に立たないか、または脆弱ではありません(上記の2つのケースのいずれか)。
ローカル変数にスタックスペースを割り当てるために使用される低レベルのコンパイラの原則を教えていない限り、私はそれを使用することをお勧めしません。そのコンテキストでそれを教えます。
GCCドキュメント には、alloca()
に関するいくつかの実用的な長所と短所があります。実用的な観点から見ると、かなりの量のフリーソフトウェアがそれを使用しているので、それがどのように機能し、既存のコードのどこで使用されているかを理解することは良いことです。
_-Wl,-stack=
_new-stack-sizeをgccに渡すと、最大スタックサイズが増加します。プロジェクトでalloca()
を使用する場合、または大きな一時配列を割り当てる場合、または特定のコンテキスト依存の深さを超えて再帰を使用する場合は、これを行う必要があります。