ランタイムヒープがCスタイル言語の動的メモリ割り当てに使用されるのはなぜですか?データ構造は両方とも「ヒープ」と呼ばれますか?何か関係はありますか?
ランタイムヒープがCスタイル言語の動的メモリ割り当てに使用されるのはなぜですか?データ構造は両方とも「ヒープ」と呼ばれますか?何か関係はありますか?
回答:
ドナルドクヌース氏は次のように述べています(The Art of Computer Programming、Third Ed。、Vol。1、p。435):
1975年頃、何人かの著者が利用可能なメモリのプールを「ヒープ」と呼び始めました。
彼はどの作者についても特定の論文への言及もしていませんが、優先度キューに関連して「ヒープ」という用語を使用することは伝統的な言葉の意味であると述べています。
それらは同じ名前を持っていますが、実際には(概念的にも)似ていません。メモリヒープは、洗濯かごを「衣類の山」と呼ぶのと同じように、ヒープと呼ばれます。この名前は、メモリを自由に割り当てたり割り当て解除したりできる、やや乱雑な場所を示すために使用されます。データ構造(参照するWikipediaのリンクが指摘するように)はかなり異なります。
名前の衝突は残念ですが、それほど神秘的ではありません。ヒープは、パイル、コレクション、グループなどを意味するために使用される小さな一般的な単語です。データ構造の単語の使用は、メモリプールの名前よりも前に(私はかなり確信しています)です。実際、私の意見では、プールは後者の方がはるかに良い選択だったでしょう。ヒープは、データ構造には適合しますが、メモリプールには適合しない(杭のような)垂直構造を意味します。メモリプールヒープは階層構造とは見なされませんが、データ構造の背後にある基本的な考え方は、ヒープ(およびサブヒープ)の一番上に最大の要素を保持することです。
ヒープのデータ構造は60年代半ばまでさかのぼります。70年代前半のメモリプールをヒープします。ヒープ(メモリプールを意味する)という用語は、少なくとも1971年にWigngaardenによってAlgolの議論で使用されました。
おそらく、データ構造としてのヒープの最も早い使用は、7年前の
ウィリアムズ、JWJ 1964で見つかりました。「アルゴリズム232-ヒープソート」、Communications of the ACM 7(6):347-348
実際、メモリの割り当て方法(バディブロックを参照)を読むと、データ構造のヒープを思い出します。
ヒープのようなデータ構造は、使用可能なメモリ割り当てを見つけるアルゴリズムによって使用されます。以下はhttp://www.cprogramming.com/tutorial/virtual_memory_and_heaps.htmlからの抜粋です。
ときに
new
呼び出され、それはあなたの要求のためのサイズに合った空きメモリブロックを探し始めます。そのようなメモリブロックが見つかった場合、予約済みとしてマークされ、その場所へのポインタが返されます。オブジェクトのサイズよりも大きい最小の空きブロックを見つけるためにメモリ全体をスキャンするか、必要なメモリが収まる最初のブロックを返すまでの間に妥協が必要なため、これを実現するアルゴリズムはいくつかあります。メモリのブロックを取得する速度を向上させるために、メモリの空き領域と予約領域は、ヒープと呼ばれるバイナリツリーと同様のデータ構造で維持されます。
C ++標準では、俗語のスタックメモリとヒープメモリは使用されていません。標準では、静的ストレージ、スレッドストレージ、自動ストレージ、動的ストレージを使用します。
詳細は、規格のStorage Duractionセクションにあります。
したがって、言語と標準ライブラリの観点からは、混乱はありません。