3

文字列操作や任意の種類の配列操作を行う必要がある場合は、int などの標準型または自己定義のデータ構造です。ローカル変数とメモリの動的割り当てと割り当て解除のどちらが優れていますか?

ローカル変数を使用している場合は、メモリの割り当て/割り当て解除を行う必要がないため、メモリ リークを防ぐことができます。しかし、人々が動的にメモリを割り当てるのが好きな理由を知りたいです。それは単なるコーディング スタイルなのか、それとも本当にメリットがあるのか​​。また、コンパイルしているシステムに依存しますか、それともコンパイラに依存しますか?

システムにメモリと速度に十分なリソースがある場合でも、コードを最適化するのに適した手法はどれですか?

4

5 に答える 5

3

ローカルでスタックに割り当てられた操作は、ほとんどの場合、速度の点で動的メモリ割り当てよりも優れています。その理由は、動的メモリ割り当て中に、プログラムがオペレーティング システムに助けを求める必要があるからです。これにより、コンテキスト スイッチ (非常に低速/高コスト) が発生し、オペレーティング システムがメモリ ブロックを返すまでブロックされます (それができない場合もあります)。

ただし、プログラムには独自のスタックが既にあるため、実行の流れを中断することなく、必要に応じてそれを操作できます (とにかく制御できないマルチタスクを除く)。

動的メモリ割り当ての利点は、実行時まで割り当てが必要な量がわからない場合があることです。動的な割り当てがなければ、事前に静的バッファーを割り当て、最悪のシナリオ (十分なリソースがない場合とない場合があります) に備えて十分なメモリを確保する必要があります。

于 2013-05-13T23:15:49.493 に答える
2

この問題で尋ねるべき質問は、プログラムが実行時に必要とするメモリサイズを知っていますか?

たとえば、必要な int 変数が 3 つだけであることがわかっている場合は、ローカル変数を使用する必要があります。メモリ リークはなく、十分なメモリが利用可能でない限り、プログラムは実行されません。

必要なメモリ量を予測できない場合、たとえば、ファイルをメモリに読み込む必要がある場合は、動的割り当てを使用するしかありません。

于 2013-05-13T22:43:42.183 に答える
0

ローカルで非 malloc の呼び出しは、ヒープ管理ではなくスタック作業のみを必要とするため、通常、割り当て/割り当て解除が高速になります。また、スコープが制限されるという追加の利点もあります。ただし、それらの範囲は限られており、多くの場合、機能を超えてメモリを保持する必要があります。

スタックスペースが限られている一部の組み込みシステムでは、より大きなヒープにアクセスするためだけにローカル var に対しても malloc を呼び出すことがありますが、一般的には、パフォーマンスの問題に関係なく、メモリアクセスを目的のスコープに制限する必要があります。

于 2013-05-13T22:39:21.523 に答える