ただし、ソフトウェア エンジニアにとって、10% に属するか 90% に属するかに関係なく、一部のパフォーマンスの問題は改善する必要があります。ここでは、問題の 1 つである、ヒープを使用するかスタックを使用するかについて説明します。
Java、C#、および JavaScript のプログラマーは、通常、作成したオブジェクトがヒープにあるかスタックにあるかを気にしません。これらの言語では、オブジェクトはヒープ内でのみ「存在」できるからです。プログラマーにとって、これは間違いなくはるかに簡単です。ただし、C++ プログラマーの場合は、オブジェクトを作成する場所を 3 つ選択できます:
オブジェクトはどこに住めばよいですか?この問題は、アプリケーションのプロパティによって決定する必要があります。たとえば、動的に生成されたグローバル変数の場合、ヒープ内に存在する以外に方法がない場合があります。
ただし、複雑なデータのキャリアとして一時オブジェクトを選択するなどの選択肢があれば、答えは明らかです。たとえば、次の単純な例はスタックの方が好ましいです。
A e // ヒープ vs スタック テスト
double HeapVsStack(bool ヒープ、int ループ、int &result) {
if (ヒープ)
{
Clock_t begin = Clock();
for(int i = 0; i { intPair *p = new intPair(1,2);
~
Clock_t end = Clock();
return double(end - begin) / CLOCKS_PER_SEC;
} その他
{
Clock_t begin = Clock(); for(int i = 0; i {
return double(end - begin) / CLOCKS_PER_SEC;
このプログラムに対して次の簡単なテスト呼び出しを行います: int 結果 = 0; printf("ヒープ時間: %f n", HeapVsStack(true, 100000, result)); printf("スタック時間: %f n", HeapVsStack(false, 100000, result)); 時間の違いが大きすぎるため、100,000 回呼び出す必要がありました。スタックのユースケースでは 10,000 回未満で 0ms が表示されました。
結論:
1) アプリケーションロジックが許可する場合は、スタックベースの自動変数を使用し、ヒープ変数は決して使用しないでください。
Seattle スタックとヒープの割り当て true
実行中のプログラムに対してコンピューターのメモリはどのように構成されますか? プログラムがメモリにロードされると、テキスト セグメント、スタック セグメント、ヒープ セグメントというセグメントと呼ばれるメモリの 3 つの領域に編成されます。テキスト セグメント (コード セグメントとも呼ばれる) は、プログラム自体のコンパイル済みコードが存在する場所であり、プログラムを構成するすべての関数 (ユーザー定義およびユーザー定義の両方) が含まれます。 system.
システム メモリの残りの 2 つの領域は、コンパイラによってデータ ストレージ用にメモリが割り当てられる場所です。スタックは、関数内の自動変数にメモリが割り当てられる場所です。スタックは、Last In First Out (LIFO) ストレージ デバイスです。新しいストレージは、スタックのトップと呼ばれる 1 つの「端」でのみ割り当てられ、割り当てが解除されます。これは、プログラムが関数 main() で実行を開始するときの図 14.13 に示されています。図 14.13(a) に示すように、main() 内で宣言されたすべての変数に対してスペースがスタック上に割り当てられます。main() が関数 func1() を呼び出すと、追加のストレージが func1() の変数に割り当てられます。スタックの一番上に...テキストの残り>>
ヒープメモリとスタックメモリの違いは何ですか?
http://www.bkjia.com/PHPjc/868462.html
www.bkjia.com