C ++ヒープとスタックの違いについて

 

C ++では、メモリは5つの領域に分割して、彼らは、ヒープ、スタック、無料の店、静的/グローバルストレージ領域と一定のストレージ領域です。  
     コンパイラが必要なときに割り当てられ、スタック、変数は必要ないときに自動的に明確な 
記憶領域を。通常、ローカル変数、関数、その他のパラメータである変数。  
     新によって割り当てられたメモリのブロックでヒープが、それらの放出コンパイラを気にしない、私たちのことであるべき 
制御するためのアプリケーション、新しい一般的には、削除に対応するであろう。プログラマが解放されていない場合は、 
その後、プログラムの最後に、オペレーティングシステムが自動的に回復します。  
     無料店舗、mallocと他のメモリブロックによって割り当てられたものであり、彼はヒープに非常に似て、 
自分たちの生活を終了して自由です。  
     グローバル/スタティックメモリは、グローバルおよび静的変数は同じメモリ、前に割り当てられている 
C言語、初期化グローバル変数および変数の初期化(初期化されていないグローバルおよび静的変数に分割され 
、領域の量を別に隣接する領域におけるグローバル変数と静的変数初期化されていない、ないが 
初期化されたオブジェクトストアは、ボイド*を介してアクセスし、操作することができ、システム自身がプログラムの終了後に放出さ 
れるC ++には区別がない)放出一緒に、彼らは同じメモリ領域を占有します。  
     定数彼らは一定である店舗内の特殊な記憶領域である記憶領域、許可していない 
変更が(もちろん、あなたはまた、非合法的な手段で変更することができ、そして多くの方法) 

 

違いは何ですかヒープとスタック?   
    以下の主な相違点:  
    1、別の管理;  
    2、異なる大きさのスペース、  
    3、異なる断片を生成することができます。  

    図4に示すように、異なる成長方向。  

    図5に示すように、異なる分布。  

    6、異なる物流効率;  
    管理は:スタックが懸念されるため、コンパイラによって自動的に管理され、我々は、手動で制御する必要はありません。ヒープの場合は 
、作業がメモリリークを起こしやすいプログラマ制御、によって解放されます。  
    スペース:一般的な、32ビットシステムでは、4Gヒープメモリ空間は、この角度から、達成することができる 
ヒープメモリのビューのは、ほとんどの制限です。しかし、スタックが懸念されるため、一定のスペースは通常あり 
大きさは、例えば、以下のVC6で、デフォルトのスタック空間は1M(のような、覚えていない)です。 
もちろん、我々は変更することができます。      
    プロジェクトを開き、次のように操作]メニューをクリックしてください:プロジェクト- >設定- >リンクを、カテゴリーに 
選択出力し、最大値を設定し、準備にスタックをコミットします。  
注意:4バイトの最小値を確保し、内部の仮想メモリページファイルに保持されるコミット、それを設定し 
、オーバーヘッドメモリを増やし、起動時間をも大きな値を開きます大規模なスタックが直面しています。  
    デブリ問題:ヒープのための新しい/削除が頻繁という点では、必然的に、メモリ空間の不連続性につながる 
ので、手続きの効率を低下させる、破片の多くを引き起こして。スタックが懸念されるためにいるので、私たちは、この問題は発生しません 
スタックはキューから進んでいるとして、彼らはあるので、一つの内部持つことはありません1に 
彼の前にポップアップでは、スタックの真ん中からメモリブロックポップアップを後方に排出された内容は、彼の上にスタックの内容で 
データ構造を参照することができ、ここで我々はそれを議論するつもりはありません。  
    成長方向:ヒープについては懸念している、成長方向、すなわち増大したメモリアドレスの側に向かって、上向きです 
その成長方向の面でスタックが下向きであるため、それは、メモリアドレスの成長の方向に減少します。  
    配布:ヒープは、動的に割り当てられた静的ヒープを割り当てられていません。静的:スタック割り当ての2種類があり 
、状態割り当てと動的割り当てが。静的割り当ては、ローカル変数の割り当てとして、コンパイラに行われています。動的に割り当てられた 
のallocaの割り当て関数ではなく、動的なスタック割り当てとヒープが異なっていて、彼のダイナミックな割り当てがある 
コンパイラをリリースすることが、我々は手動で達成する必要はありません。  
    効率を分配:スタックがシステムによって提供される機械のデータ構造である、コンピュータは、スタックのための基礎となるサポートを提供します: 
専用アドレスレジスタを割り当てることスタックを格納し、スタックは、専用のプッシュ命令を有するスタック決定する、実行される 
効率は比較的高いです。スタックは、例えば、ポイントに、その機構が複雑で提供されるC / C ++ライブラリである 
メモリと、ライブラリ関数は、特定のアルゴリズム(特定のアルゴリズムは、データ構造/動作基準できる続く 
ヒープメモリ内のシステム)利用可能な十分な大きさの探索空間、(おそらく十分な大きさのスペースがない場合は 
、あまりにも断片化されたメモリが原因で)、メモリ空間プログラムのデータセグメントを高めるために、システムの機能を呼び出すことが可能であるが、この 
種の十分なメモリサイズを割り当てることができる機会を持っていますその後、戻ります。明らかに、スタックよりもはるかに低い効率をヒープ。  
    私たちは簡単に作られて、ここから見るヒープと新しい/削除の多数の使用に比べて積み重ねることができ 
、特別な支援制度がないため効率が悪い;原因はユーザーモードにつながる可能性があり、メモリの断片化の多数に 
スイッチとコアの状態メモリアプリケーションでは、コストがより高価になります。だから、スタックは、最も広くプログラムで使用されて 
も、呼び出された関数は、アドレス、返し、関数呼び出しのパラメータの間に、完了するために、スタックを使用し、パン 
EBPを、ローカル変数は、道のスタックを格納するために使用されています。したがって、我々はあなたがではなく、スタックを使用しようとお勧めします 
ヒープ。  
    スタックは、非常に多くの利点がありますが、それは大きな割り当てるために、時には比べて柔軟性およびヒープされていないためものの 
メモリ空間の量を、またはより良いヒープを持ちます。  

 

 

参考:

https://blog.csdn.net/qianyayun19921028/article/details/80364964

 

おすすめ

転載: www.cnblogs.com/sea-stream/p/11361476.html