alloca
現実の世界ではどれくらい広く使われていますか?alloca
理にかなっているときに生徒に使用を教えるべきですか?または、絶対に使用しないように教える必要がありますか?C ++ RAIIのバックグラウンドから来るとfree
、特に複数の出口点を持つ関数では、手動で呼び出す必要がないという考えは有望に聞こえます。
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
危険を見せてから、使用しないように伝えます。彼らは、スタックとヒープについてまだ学び、実際の危険を見て、標準的なものに進むことができます。
_alloca
なくを使用していますalloca
か?そして、なぜそれは結果をキャストしますか?
この質問に対する答えは、そもそも目的が何であるかに基づいているべきです。
Cの記述方法をプログラミングし、既存のCコードを実際に使用する方法を既に知っている人に教えたいですか?もしそうなら、allocaとあなたが望む他の何かについて教えてください。
一方、偶然にCのみを使用する入門コースを教える場合(およびCは非常に小さな言語などであるため)、重要な部分(モジュラープログラム、サブルーチン、コレクションなどの記述)に集中する必要があります。 。)。学生の観点からは、ほとんどの場合mallocで十分であるためallocaは冗長です。コードの観点からは、手動のメモリ管理が煩わしく、他の言語がこの問題をどのように処理するかを明示する方がよいでしょうメモリー管理への事柄、次にallocaまたはRAIIですので、これらに制限するべきではありません。既に述べたように、他の言語で他の「より標準的な」方法と比較すると、allocaの目的を理解しやすくなります(またはC99 ...)
番号。
Cプログラマーがallocaの存在を認識する必要がある唯一の理由は、それを使用しているレガシーコードを理解して修正することです。
の使用alloca
はいずれかです
私が実際の例を見つけたことのないいくつかの思考実験を除けば、alloca
役に立たなかったり脆弱ではない(上記2つのケースのいずれか)使用例はありません。
alloc
、固定サイズの自動配列と100%同等であり、移植性が低くなります。
T foo[5000];
何でも使用できます。
std::mutex
、5000のミューテックスに対してカーネルコールとコンテキストスイッチを呼び出します。安くない。配列の後にローカル変数を配置する追加のキャッシュコストは言うまでもありません。
GCCのドキュメントでは、上のカップル実用的長所と短所がありますalloca()
。実用的な観点からは、かなりの量のフリーソフトウェアがそれを使用しているので、それがどのように機能し、既存のコードでどこで使用されているかを理解するのは良いことです。
-Wl,-stack=
new-stack-sizeをgccに渡すと、最大スタックサイズが増加します。プロジェクトでを使用する場合alloca()
、または大きな一時配列を割り当てる場合、または特定のコンテキスト依存の深さを超える再帰を使用する場合は、これを行う必要があります。