2017-07-01 4 views
0

「メモリはスタックに割り当てられている」、「これらの変数はヒープに配置されている」などのものを読みます。私はかつてマイクロプロセッサーに関する本を勉強していて、スタックと呼ばれるものにトピックやセクションがあったことをかすかに覚えています。また、スタックはLIFO型のデータ構造の一種でもあります。メモリ割り当てのコンテキストで正確にスタックと意味するもの

だから、私はスタックが何を意味するのか混乱しています。スタックと呼ばれるレジスタ以外のすべてのマイクロプロセッサにメモリ位置がありますか?

答えて

1

最も一般的な状況について説明します。

このコンテキストでは、スタックはプログラムの専用メモリです(より正確にはスレッド用)。このメモリは、プログラムの起動時にオペレーティングシステムによって自動的に割り当てられます。通常(必ずではありませんが)、スタックはメインメモリから割り当てられます(したがって、CPU内の特別なメモリではありません)。

「LIFOスタイル」で使用されているため、名前はスタックです。関数が呼び出されると、そのローカル変数がスタックから割り当てられます(スタックにプッシュされます)。それが返ってくると、これらの変数は解放されます(スタックからポップします)。

ヒープについて:ヒープは、スタックよりも柔軟にメモリを割り当てることができる場所です。ヒープ・ストレージ・スペースは、通常、スタックよりもはるかに大きくなります。そして、割り当てられたスペースは、(スペースを割り当てた)関数が返っても使用可能になります。ガベージコレクションを持たない言語の場合は、割り当てられた領域を手動で解放する必要があります。このヒープをデータ構造ヒープと混同しないでください。これはまったく別のものです。

char *var; 
void example(int length) { 
    char stackVar[1024]; // a 1024 element char array allocated on the stack 
    char *heapVar = new char[length]; // a length sized variable allocated on the heap, and a pointer (heapVar) to this place allocated on the stack 

    var = heapVar; // store a pointer to the allocated space 

    // upon return, stackVar is automatically freed 
    //    the pointer heapVar automatically freed 
    //    the space that heapVar points to is not freed automatically, can be used afterwards (via the var pointer) 
} 
+0

ありがとうございます。ヒープはどうですか? –

+0

もう一度ありがとうございます。スタック上のヒープにこれらの柔軟性を与えるものを尋ねるとどうなりますか? –

+0

@MikhailTal:スタックからの割り当ては簡単ですが、それは単なるポインタの動きです。スタックでは、最後に割り当てられたメモリ領域の割り当てを解除できます(最後のプッシュだけをポップすることができます)。ヒープで、あなたは何でもしたいことができます。いくつかのメモリを割り当ててから、もう少し多くのメモリを割り当て、割り当てられたメモリを解放します。だからメモリには "穴"ができる。ヒープからの割り当てには、アロケータ側からの洗練されたアルゴリズムが必要です(高速で、メモリの断片化などを避けるため) – geza

関連する問題