生徒にアロカを教えるべきですか?[閉まっている]


18

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



8
C99 VLAを教えてみませんか?

@cnicutar alloca()は実装依存ですが、少なくとも多くの実装は失敗するとNULLを返します。C99 VLAには、障害を示す方法がありません。
複雑なバイオを参照してください

2
@sbi:SOの場合、これは自由回答形式の質問であり、SOの投稿がどうあるべきかをクローザーが考える形式に実際には適合しません。それはあまりにも主観的であり、明確な答えはなく、単に意見があります。これは結構ですが、SOには適していません。また、OPの担当者への敬意から、誰も投票しないことに注意してください。この質問はトピックから外れています。
ポール・サシク

1
@PascalCuoqとにかくalloca / VLAで多くを割り当てるべきではありません。現在のコンテキストで「多く」が何であるかわからない場合は、を使用しますmalloc

回答:


31

一般的なCプログラミングのコースを開催している場合は、標準にないことを教えるべきではありません。初心者プログラマーは、そのように教えられたので、非標準および/または非ポータブルコードを不必要に書くことは、過去20〜30年ほどの間にソフトウェア業界にとって大きな問題でした。彼らに標準を教えることなく、標準以外は何も教えないための費用は天文学的なものである可能性が高い。

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


別の方法で改善されない場合に見た唯一の用途は、Windowsの一部のバージョンでスタックスマッシュ検出を行うことでした。 ; そのコードを見てからしばらく経ちました。それはうまくいきましたが、少し恐怖でした。
ドナルドフェローズ

13

次の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

危険を見せてから、使用しないように伝えます。彼らは、スタックとヒープについてまだ学び、実際の危険を見て、標準的なものに進むことができます。


1
サンプルコードを見せた後でも、ほとんどの学生はまだ2番目のカテゴリに分類されると思います。
右折

@WTP-おそらく、だからこそ、何が起こるかを見せた後でも、それを使わないようにと言うのです。
ブラックジャック

4
なぜそのコードでは_allocaなくを使用していますallocaか?そして、なぜそれは結果をキャストしますか?
キーストンプソン

5

この質問に対する答え、そもそも目的が何であるかに基づいているべきです。

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

一方、偶然にCのみを使用する入門コースを教える場合(およびCは非常に小さな言語などであるため)、重要な部分(モジュラープログラム、サブルーチン、コレクションなどの記述)に集中する必要があります。 。)。学生の観点からは、ほとんどの場合mallocで十分であるためallocaは冗長です。コードの観点からは、手動のメモリ管理が煩わしく、他の言語がこの問題をどのように処理するかを明示する方がよいでしょうメモリー管理への事柄、次にallocaまたはRAIIですので、これらに制限するべきではありません。既に述べたように、他の言語で他の「より標準的な」方法と比較すると、allocaの目的を理解しやすくなります(またはC99 ...)


2

番号。

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

の使用allocaはいずれかです

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

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


2
もちろん、責任を持って使用できる人は絶対にいません。いいえ、決して。
-DeadMG

唯一の「責任ある」使用はalloc、固定サイズの自動配列と100%同等であり、移植性が低くなります。
R ..

すると、だれも動的な量、たとえばオーバーフローしないような数キロバイトを割り当てることはできなかったと思います。または、使用可能な量を通知するOS API関数を呼び出します。または、スタックサイズを大幅に増やします。
DeadMG

数KBで、数KBあると確信している場合は、T foo[5000];何でも使用できます。
R ...

Tに単純なデフォルトコンストラクターがある場合のみ。パフォーマンスが悪い場合は、メモリの単純なゼロ化でもコストがかかる可能性があります。しかし、他のタイプでは、さらに複雑なデフォルト構築ロジックを使用できます。たとえば、の配列を動的に作成する場合はstd::mutex、5000のミューテックスに対してカーネルコールとコンテキストスイッチを呼び出します。安くない。配列の後にローカル変数を配置する追加のキャッシュコストは言うまでもありません。
DeadMG

1

ローカル変数にスタック空間を割り当てるために使用される低レベルのコンパイラ原則を教えているのでない限り、私の意見ではそれを使用することは推奨しません。その文脈でそれを教えてください。


0

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.