web-dev-qa-db-ja.com

生徒に割り当てを教える必要がありますか?

現実世界でallocaはどのくらい広く使用されていますか? allocaを使用するように生徒に教える必要がありますか?それとも、絶対に使用しないように教えるべきでしょうか? C++ RAIIのバックグラウンドから来て、freeを手動で呼び出す必要がないという考えは、特に複数の出口点を持つ関数では有望に聞こえます。

18
fredoverflow

一般的なCプログラミングのコースを実施している場合、それらを教えるべきではありませんこれは標準にはありません。初心者プログラマーは、そのように教えられたため、不必要に非標準のコードや移植性のないコードを書く必要があり、過去20〜30年ほどの間、ソフトウェア業界にとって大きな問題でした。彼らに標準を教えないで、標準だけを教えるためのコストは、おそらく天文学的なものです。

アルゴリズムまたはアプリケーションプログラミングのより高度なコースを開催している場合は、それについて言及することをお勧めします。一方、ハードリアルタイムの組み込みアプリからWindowsアプリケーションフラッフまで、15年間、その機能を使用せずにすべてをプログラミングしてきました。

31
user29079

私は2つのことが起こっているのを見ることができます:

  1. 生徒はallocaの影響を理解し、スタックとヒープの違いについて読み、allocaを慎重に使用します。 (そうではない)

  2. 学生たちは「すごい、これは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

危険を示してから、使用しないように伝えます。彼らはまだスタックとヒープについて学習し、動作中の危険を確認し、標準的なものに進むことができます。

13
BlackJack

この質問への答えは、最初に目的が何であるかに基づいている必要があります。

Cの書き方をプログラミングし、既存のCコードを実際に使用する方法をすでに知っている人に教えたいですか?もしそうなら、アロカとあなたが望む他のものについて教えてください。

一方、偶然にCのみを使用している入門コースを教える場合(Cは非常に小さな言語であるためなど)、重要な部分(モジュール式プログラム、サブルーチン、コレクションなどを書く)に集中する必要があります。 。)。学生の観点からすると、アロカはほとんどの場合mallocで十分であるため、冗長であり、適切なコードの観点からは、手動のメモリ管理がいらいらしている方法とother言語がこの問題を処理する結局のところ、メモリ管理にはallocaやRAIIよりも多くのことがあるので、これらに限定するべきではありません。すでに述べたように、 allocaを他の言語(またはC99 ...)で実行する他の「より標準的な」方法と比較した場合

5
hugomg

番号。

Cプログラマーがallocaの存在を認識する必要がある唯一の理由は、それを使用しているレガシーコードを理解して修正することです。

allocaの使用はいずれかです

  1. 役に立たない、つまり、自動ストレージ期間の固定サイズの変数で簡単に置き換えることができる、または
  2. 危険スタックオーバーフロー発生を待っています。

私が実際の例を見つけたことのないいくつかの思考実験を除いて、alloca(またはVLA)の使用例はありません。これは、役に立たないか、または脆弱ではありません(上記の2つのケースのいずれか)。

ローカル変数にスタックスペースを割り当てるために使用される低レベルのコンパイラの原則を教えていない限り、私はそれを使用することをお勧めしません。そのコンテキストでそれを教えます。

1
MartyTPS

GCCドキュメント には、alloca()に関するいくつかの実用的な長所と短所があります。実用的な観点から見ると、かなりの量のフリーソフトウェアがそれを使用しているので、それがどのように機能し、既存のコードのどこで使用されているかを理解することは良いことです。

_-Wl,-stack=_new-stack-sizeをgccに渡すと、最大スタックサイズが増加します。プロジェクトでalloca()を使用する場合、または大きな一時配列を割り当てる場合、または特定のコンテキスト依存の深さを超えて再帰を使用する場合は、これを行う必要があります。

0
user117529