C++メモリ割り当て方式

2941 ワード

C++におけるメモリの割り当て方式と割り当て領域.
スタック、スタック、静的記憶領域.
スタック(heap):プログラマーによって割り当てられ、newとdelete.これらのリリースコンパイラは、アプリケーションによって制御され、一般的に1つのnewがdeleteに対応します.プログラマーが解放されていない場合は、プログラムが終了するとオペレーティングシステムが自動的に回収されます.スタックは動的に拡張され収縮することができる.
スタック(stack):コンパイラによって必要に応じて割り当てられ、必要でないときに自動的に消去される変数の記憶領域です.中の変数は通常局所変数、関数パラメータなどです.1つのプロセスでは、ユーザー仮想アドレス空間の上部にあるスタックがあり、コンパイラは関数呼び出しを実現します.
≪グローバル/静的ストレージ領域|Global/Static Storage Area|emdw≫:プログラムのコンパイル時にメモリが割り当てられ、プログラムの実行期間全体が存在します.プログラムが終了するとシステムから解放されます.たとえば、グローバル変数、static変数です.
 
プログラム例://もちろん私が書いたわけではありません
#include <iostream>
usingnamespacestd;
 
inta=0;//      
char*p1;//       
 
intmain()
{
    intb;// 
    chars[]="abc";// 
    char*p2;// 
    char*p3="123456";//123456/0    ,p3   。
    staticintc=0;//  (  )    
    p1=(char*)malloc(10);
    p2=(char*)malloc(20);
    //     10 20         。
    strcpy(p1,"123456");//123456/0     ,         p3    "123456"       。
}

 
スタックの知識:まず次のコードを見てください.
void f()
{
    int *p = new int[5];
}

ポインタpが5つのint型空間を割り当てることがわかる.newを見ると、割り当てられているのはスタックの空間です.pは関数f()の局所変数であるため、スタック上にある.したがって、スタックメモリには(int型空間の5つのスタックメモリ)を指すポインタpが格納されている.このメモリを解放するときはdeelte[]pを使用する.(注意削除したのは配列で数ではありません.)
 
では、スタックとスタックの違いは何でしょうか.
管理方式が異なるスペースサイズの違い断片化の相違成長方向が異なる割り当て方法の違い分配効率が異なる1.管理方式が異なる:
スタックにとって、コンパイラの自動管理であり、手動制御を必要としない.スタックの場合、解放作業はプログラマーによって制御されます.
2.スペースのサイズが異なる:
スタックのサイズ:WINDOWSではスタックのサイズは2 M(1 Mということもありますが、要するにコンパイル時に決定される定数)であり、申請されたスペースがスタックの残りのスペースを超えるとoverflowが提示されます.したがって、スタックから得られる空間は小さい.≪ヒープのサイズ|Heap Size|emdw≫:ヒープのサイズは、コンピュータ・システムで有効な仮想メモリに制限されます.このことから,スタックが得られる空間は比較的柔軟であり,比較的大きいことが分かる.
3.断片化が異なる場合:
スタックの場合、頻繁なnew/deleteはメモリ領域の不連続をもたらし、大量の破片をもたらし、プログラムの効率を低下させるに違いない.スタックにとって、この問題は存在しません.スタックは先進的な後出キューであるため、彼らはこのように対応しており、スタックの間からメモリブロックがポップアップすることは永遠に不可能です.彼がポップアップする前に、彼の上の後進的なスタックの内容がポップアップされました.
4.成長方向が異なる:
スタックにとって、成長方向は上向きであり、すなわちメモリアドレスが増加する方向である.スタックの場合、その成長方向は下向きであり、メモリアドレスが減少する方向に成長します.
5.分配方式が異なる:
スタックはすべて動的に割り当てられ、静的に割り当てられていないスタックです.スタックには、静的割当てと動的割当ての2つの割当て方式があります.静的割当ては、ローカル変数の割当てなど、コンパイラによって完了します.動的割り当てはmalloc関数によって割り当てられます.しかし、スタックの動的割り当てとスタックは異なり、彼の動的割り当てはコンパイラによって解放され、手作業で実現する必要はありません.
6.分配効率が異なる:
スタックは機械システムが提供するデータ構造で、コンピュータは底層でスタックにサポートを提供します:専門のレジスタ格納スタックのアドレスを割り当てて、スタックを押してスタックを出してすべて専門の命令が実行して、これはスタックの効率が比較的に高いことを決定しました.スタックはC/C++関数ライブラリで提供され、そのメカニズムは複雑です.例えば、メモリを割り当てるために、ライブラリ関数は一定のアルゴリズム(具体的なアルゴリズムはデータ構造/オペレーティングシステムを参照できます)に従って、スタックメモリの中で利用可能な十分なサイズの空間を検索します.十分なサイズの空間がなければ(メモリの破片が多すぎるためかもしれません)、システム機能を呼び出してプログラムデータセグメントのメモリ領域を増やすことができ、十分なサイズのメモリに分けて返す機会があります.明らかに、スタックの効率はスタックよりずっと低い.
 
一般的にスタック(stack)とはスタックを指し、先進的にはメモリ領域である.プログラムの局所変数,一時変数,関数のパラメータ,戻りアドレスなどを格納するために用いられる.この領域における変数の割り当てと解放はシステムによって自動的に行われる.ユーザーの参加は必要ありません.スタック(heap,先進先出)上の空間はユーザーによって割り当てられ、ユーザーが転載を解放する責任を負う.http://blog.tk-xiong.com/archives/415