Cスタイル言語の動的メモリ割り当てにランタイムヒープが使用され、 データ構造 が両方とも「ヒープ」と呼ばれるのはなぜですか?何か関係はありますか?
Donald Knuthは次のように述べています(The Art of Computer Programming、Third Ed。、Vol。1、p.435):
何人かの著者は1975年頃から利用可能なメモリのプールを「ヒープ」と呼び始めました。
彼はどの著者か特定の論文への言及を与えていないが、優先順位キューに関連する用語「ヒープ」の使用は、Wordの伝統的な意味であると言っている。
それらは同じ名前を持っていますが、実際には似ていません(概念的にも)。メモリヒープは、ランドリーバスケットを「衣類のヒープ」と呼ぶのと同じように、ヒープと呼ばれます。この名前は、メモリを自由に割り当てたり割り当て解除したりすることができる、やや厄介な場所を示すために使用されます。データ構造(参照するウィキペディアのリンクが指摘しているように)はまったく異なります。
名前の衝突は残念ですが、それほど神秘的ではありません。 Heapは、パイル、コレクション、グループなどを意味するために使用される小さな一般的なWordです。データ構造の前の日付(確かに)メモリのプールの名前。実際、私の意見では、poolは後者の方がずっと良い選択だったでしょう。 Heapは、データ構造には適合しますが、メモリプールには適合しない垂直構造(パイルのような)を意味します。メモリプールヒープを階層構造とは見なしませんが、データ構造の背後にある基本的な考え方は、ヒープ(およびサブヒープ)の最上部に最大要素を保持することです。
ヒープのデータ構造は60年代半ばまでさかのぼります。 70年代初期のメモリプールをヒープ化します。ヒープ(メモリプールを意味する)という用語は、ALGOLの議論で Wijngaarden によって少なくとも1971年に使用されました。
おそらく、データ構造としてheapを最も早く使用したのは、
Williams、J. W. J. 1964. "Algorithm 232-Heapsort"、Communications of the ACM7(6):347-348
実際、メモリの割り当て方法について読むと( バディブロック を参照)、データ構造のヒープが思い出されます。
ヒープのようなデータ構造は、利用可能なメモリ割り当てを見つけるアルゴリズムによって使用されます。以下は http://www.cprogramming.com/tutorial/virtual_memory_and_heaps.html からの抜粋です。
new
が呼び出されると、リクエストのサイズに適合する空きメモリブロックの検索が開始されます。このようなメモリブロックが見つかった場合、予約済みとしてマークされ、その場所へのポインタが返されます。オブジェクトのサイズよりも大きい最小の空きブロックを見つけるためにメモリ全体をスキャンするか、メモリが必要な最初のブロックを返す間に妥協が必要になるため、これを達成するためのアルゴリズムがいくつかあります。メモリブロックの取得速度を向上させるために、メモリの空き領域と予約領域は、ヒープと呼ばれるバイナリツリーと同様のデータ構造で維持されます。
Q.ヒープとは何ですか? A.ヒープは、互いの上に配置されたオブジェクトのコレクションです。
あなたの質問への答え:メモリヒープとバイナリヒープの両方は、あなたが知っているのと同じ概念を使用します。データは、プログラムに書き込まれたのと同じ順序でメモリにヒープの形式で格納されますが、バイナリヒープは、ヒープの形式で順序付けられた方法でデータを格納するという同じ概念に従うデータ構造です他の)。コメント欄であなたの意見を聞かせてください。
口語用語のスタックメモリとヒープメモリは、C++標準では使用されません。標準では、静的ストレージ、スレッドストレージ、自動ストレージ、および動的ストレージが使用されます。
詳細は、標準の Storage Duractionセクション にあります。
したがって、言語と標準ライブラリの観点からは、混乱はありません。