C ++、フリーストアとヒープ


124

動的な割り当てはnew/delete上の場所を取ると言われているフリー店舗
一方でmalloc/free操作が使用ヒープを

実際に実際の違いがあるかどうか知りたいのですが。
コンパイラーは2つの用語を区別しますか?(無料ストアヒープではなくnew/malloc

回答:


76

http://www.gotw.ca/gotw/009.htmを参照してください。ヒープとフリーストアの違いを私が説明できるよりもはるかによく説明できます。

フリーストア:

空きストアは、2つの動的メモリ領域の1つであり、new / deleteによって割り当て/解放されます。オブジェクトの有効期間は、ストレージが割り当てられた時間よりも短くなる場合があります。つまり、空きストアオブジェクトには、すぐに初期化せずにメモリを割り当てることができ、メモリをすぐに割り当て解除せずに破棄することができます。ストレージが割り当てられている期間中、オブジェクトの有効期間外では、ストレージはvoid *を介してアクセスおよび操作できますが、プロトオブジェクトの非静的メンバーまたはメンバー関数にはアクセスできず、アドレスが取得されず、その他の方法で操作できません。

ヒープ:

ヒープは、malloc / freeとそのバリアントによって割り当て/解放された他の動的メモリ領域です。デフォルトのグローバルなnewおよびdeleteは、特定のコンパイラーによってmallocおよびfreeの観点から実装される可能性がありますが、ヒープはフリーストアと同じではなく、一方の領域に割り当てられたメモリは、もう一方に安全に割り当て解除できません。ヒープから割り当てられたメモリは、配置-新規構築および明示的な破棄により、クラスタイプのオブジェクトに使用できます。このように使用した場合、無料ストアオブジェクトの有効期間に関するメモは、ここでも同様に適用されます。


23
同意しません。ダイナミックアロケーションのコンテキストでの「ヒープ」という単語は、C ++標準でもC99でも使用されていません(C ++が参照するC89はありません。この単語を使用している場合は、遠慮なく修正してください)。問題のGotWが公開された日付はわかりませんでしたが、ドラフトについて話しているので、それは明らかに先行標準です。
avakar 2009

2
これはすべて、用語の問題です、imho。言って、ミスター。Stroustrupは「ヒープ」と「フリーストア」を区別しません: stroustrup.com/Programming/17_free_store.ppt、スライド12。「ヒープ」は、Lispの時代(1960年代)以降、動的メモリの同義語として使用されていました。メモリ割り当て用のヒープデータ構造。
Alexey Voytenko 2016年

私は通常、ヒープを(maloc / freeを介して)一種の「原材料」サプライヤーと考えています。あなたはメモリのチャンクを要求しますが、それは簡単です。自分で構造を構築する必要があります。Free Store(新規/削除)は、「完成品」サプライヤーに似ています。オブジェクトを要求すると、そのオブジェクトにスペースが割り当てられ、オブジェクトが作成されて使用できるように準備されます。使い終わったらきれいに掃除されます。
Anshuman Kumar

67

C ++の場合、フリーストアとヒープの違いは純粋に概念的なものになっています。バグを収集するためのjarや、cookieを収集するためのjarのようなものです。一方には一方のラベルが付けられ、もう一方には別のラベルが付けられます。この指定は、「new」と「delete」を「malloc」、「realloc」、または「」と決して混合しないように注意して帰宅することを目的としていますfree」(またはビットレベルセット)。

インタビューの際に、「無料ストアnewdelete利用して、mallocおよびfreeヒープを使用する; newそしてdeleteそれぞれ、ただし、コンストラクタとデストラクタを呼び出すmallocfree。ありません」しかし、メモリセグメントが実際には同じ領域にあるとよく耳にしますが、それはコンパイラ固有である可能性があります。つまり、両方が異なるメモリスペースをプールとして指定できる可能性があります(理由は不明ですが、ただし)。


28

マイク・コヴァルの答えは理論をかなりカバーしています。ただし、実際には、ほとんどの場合、それらは同じメモリ領域です。ほとんどの場合、コンパイラのの実装を掘り下げるとnew、次の呼び出しが見つかります。malloc()

つまり、マシンの観点からは、ヒープとフリーストアは同じものです。この違いはコンパイラ内部にあります。

物事をさらに混乱させるために、C ++が登場する前は、「ヒープ」とは、現在「フリーストア」と呼ばれているものを意味すると言っていました。


5

「ヒープ」という用語は、特定のデータ構造を指す場合もありますが、C ++のmalloc、free、new、およびdelete操作のコンテキストでは、「heap」と「free store」という用語は、ほぼ同じ意味で使用されます。


3

ヒープとフリーストアは相互運用可能ではありません。c ++ 11標準ライブラリを備えたAVR 8ビットマイクロコントローラーのような制約されたコンテキストでは、それらを同じプログラムで使用することもできません。フリーストアとヒープは、同じメモリ空間で割り当てを行い、他の構造とデータを上書きします。このコンテキストでは、フリーストアはヒープとは異なり、互換性がありません。「新規/削除フリーストアライブラリ」は「Malloc / free / realloc / callocヒープライブラリ」よりもシンプル(かつ高速)で、メモリ使用量が大幅に増加します。 C ++組み込みプログラマー(RAMが512バイトしかない状況で)。

https://github.com/ambroise-leclerc/ETL/tree/master/libstdで 8ビットc ++ 11/14標準ライブラリを参照してください


2

push_heapet alのようなヒープ関数の説明を除いて、ヒープという単語に言及した標準を思い出しません。すべての動的割り当ては、フリーストアで実行されます。


1

Free Storeは、プログラムに割り当てられた未割り当てのヒープメモリのプールであり、プログラムの実行中に動的割り当てのためにプログラムによって使用されます。すべてのプログラムには、実行中に利用できる未割り当てのヒープメモリのプールが用意されています。この利用可能なメモリのプールは、プログラムの空きストアと呼ばれます。割り当てられた空きストアメモリには名前がありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.