スタックとヒープの違い
コンテンツ
スタックとヒープは、メモリ割り当て技術で使用されるメモリセグメントです。スタックとヒープの主な違いは、スタックが静的メモリ割り当てで使用されるメモリの線形および順次割り当てを含むのに対し、ヒープはメモリをランダムに割り当てたストレージ領域のプールとして機能することです(動的メモリ割り当て)。
速度は、スタックとヒープを区別する主要なパラメーターです。スタックはヒープよりもかなり高速です。
- 比較表
- 定義
- 主な違い
- 結論
比較表
比較の根拠 | スタック | ヒープ |
---|---|---|
ベーシック | メモリは(LIFO)Last in first out方式で割り当てられます。 | メモリはランダムな順序で割り当てられます。 |
割り当てと割り当て解除 | 自動 | マニュアル |
コスト | もっと少なく | もっと |
実装 | ハード | かんたん |
呼び出す | に) | O(1) |
問題 | メモリ不足 | メモリの断片化 |
参照の局所性 | 優れた | 適切な |
柔軟性 | 固定サイズで柔軟性がない | サイズ変更が可能 |
アクセス時間 | もっと早く | もっとゆっくり |
スタックの定義
スタック割り当ては、プッシュおよびポップ操作を使用してプロセスにメモリを割り当てるためのLIFO(後入れ先出し)戦略に従います。メモリ内の各ブロックは固定サイズであり、拡張または縮小することはできません。スタックの最後のエントリにはいつでもアクセスできます。スタックは、スタックベースと名付けられたポインタがスタックの最初のエントリを指し、スタックのトップと名付けられた別のポインタがスタックの最後のエントリを指す連続メモリを使用します。
スタックは関数呼び出しもサポートしています。関数呼び出しは、スタックエントリのコレクションを保持でき、スタックフレームと呼ばれます。スタックフレームの別の名前は、プログラムのコンパイル時に使用されるデータを格納するため、コンパイラのconのアクティベーションレコードです。関数が呼び出されるたびに、スタックフレームがスタックにプッシュされます。
スタックフレームは、関数のパラメーターのアドレスまたは値と、関数の実行完了後にコントロールを返す場所を示す戻りアドレスで構成されます。
ヒープの定義
ヒープ割り当ては、明確なアプローチに従っていません。むしろ、メモリのランダムな割り当てと割り当て解除を許可します。プロセスによる割り当て要求は、ヒープ内の割り当てられたメモリ領域へのポインタで返され、プロセスはポインタを介して割り当てられたメモリ領域にアクセスします。
割り当て解除は、メモリが自動的に割り当て解除されるスタックとは異なり、割り当て解除要求によって実行されます。ヒープは、データ構造が構築および解放されるときにメモリ割り当てに穴を開けます。実行時に使用されます。
- スタックでは、割り当てと割り当て解除はCPUによって行われ、自動的に行われますが、ヒープでは、プログラマが手動で行う必要があります。
- ヒープフレームの処理は、スタックフレームの処理よりもコストがかかります。
- スタックの実装は複雑です。反対に、ヒープの実装は簡単です。
- スタック内の関数呼び出しにはO(N)時間かかります。対照的に、ヒープ内ではO(1)時間かかります。
- スタックの実装には、主にメモリ不足の問題があります。それどころか、ヒープの主な問題は断片化です。
- スタックはメモリの小さな領域に限定され、常にキャッシュにヒットするため、スタックフレームへのアクセスはヒープよりも簡単ですが、ヒープフレームはメモリ全体に分散されるため、メモリアクセスによりキャッシュミスが発生する可能性があります。
- スタックは柔軟性がなく、割り当てられたメモリサイズは変更できません。一方、ヒープは柔軟であり、割り当てられたメモリを変更できます。
- ヒープは、スタックよりもアクセスに時間がかかります。
結論
スタック割り当ては高速ですが複雑です。一方、ヒープは低速ですが、その実装はスタックよりも簡単です。ヒープはスタックよりも効率的です。