動的な割り当てはnew/delete
上の場所を取ると言われているフリー店舗、
一方でmalloc/free
操作が使用ヒープを。
実際に実際の違いがあるかどうか知りたいのですが。
コンパイラーは2つの用語を区別しますか?(無料ストアとヒープではなくnew/malloc
)
動的な割り当てはnew/delete
上の場所を取ると言われているフリー店舗、
一方でmalloc/free
操作が使用ヒープを。
実際に実際の違いがあるかどうか知りたいのですが。
コンパイラーは2つの用語を区別しますか?(無料ストアとヒープではなくnew/malloc
)
回答:
http://www.gotw.ca/gotw/009.htmを参照してください。ヒープとフリーストアの違いを私が説明できるよりもはるかによく説明できます。
フリーストア:
空きストアは、2つの動的メモリ領域の1つであり、new / deleteによって割り当て/解放されます。オブジェクトの有効期間は、ストレージが割り当てられた時間よりも短くなる場合があります。つまり、空きストアオブジェクトには、すぐに初期化せずにメモリを割り当てることができ、メモリをすぐに割り当て解除せずに破棄することができます。ストレージが割り当てられている期間中、オブジェクトの有効期間外では、ストレージはvoid *を介してアクセスおよび操作できますが、プロトオブジェクトの非静的メンバーまたはメンバー関数にはアクセスできず、アドレスが取得されず、その他の方法で操作できません。
ヒープ:
ヒープは、malloc / freeとそのバリアントによって割り当て/解放された他の動的メモリ領域です。デフォルトのグローバルなnewおよびdeleteは、特定のコンパイラーによってmallocおよびfreeの観点から実装される可能性がありますが、ヒープはフリーストアと同じではなく、一方の領域に割り当てられたメモリは、もう一方に安全に割り当て解除できません。ヒープから割り当てられたメモリは、配置-新規構築および明示的な破棄により、クラスタイプのオブジェクトに使用できます。このように使用した場合、無料ストアオブジェクトの有効期間に関するメモは、ここでも同様に適用されます。
C ++の場合、フリーストアとヒープの違いは純粋に概念的なものになっています。バグを収集するためのjarや、cookieを収集するためのjarのようなものです。一方には一方のラベルが付けられ、もう一方には別のラベルが付けられます。この指定は、「new
」と「delete
」を「malloc
」、「realloc
」、または「」と決して混合しないように注意して帰宅することを目的としていますfree
」(またはビットレベルセット)。
インタビューの際に、「無料ストアnew
をdelete
利用して、malloc
およびfree
ヒープを使用する; new
そしてdelete
それぞれ、ただし、コンストラクタとデストラクタを呼び出すmalloc
とfree
。ありません」しかし、メモリセグメントが実際には同じ領域にあるとよく耳にしますが、それはコンパイラ固有である可能性があります。つまり、両方が異なるメモリスペースをプールとして指定できる可能性があります(理由は不明ですが、ただし)。
ヒープとフリーストアは相互運用可能ではありません。c ++ 11標準ライブラリを備えたAVR 8ビットマイクロコントローラーのような制約されたコンテキストでは、それらを同じプログラムで使用することもできません。フリーストアとヒープは、同じメモリ空間で割り当てを行い、他の構造とデータを上書きします。このコンテキストでは、フリーストアはヒープとは異なり、互換性がありません。「新規/削除フリーストアライブラリ」は「Malloc / free / realloc / callocヒープライブラリ」よりもシンプル(かつ高速)で、メモリ使用量が大幅に増加します。 C ++組み込みプログラマー(RAMが512バイトしかない状況で)。
https://github.com/ambroise-leclerc/ETL/tree/master/libstdで 8ビットc ++ 11/14標準ライブラリを参照してください