2010-12-12 11 views
0

ここで、これらの命令がどのようにメモリを割り当てるのかをご説明します。それらは、それが実際にRAMにどのように見えるか、割り当てられている場合はC++ new/new []、どのようにメモリを割り当てるのですか?

x = new int[5]; 
y = new int[5]; 

:私はコードを得た場合どのような例えば

? 変数またはブロック(メモリページまたは32ビットで4KBのサイズのメモリページ)ごとに、ブロック全体が2つの変数で共有されていますか?

私の質問に対する回答はどのマニュアルでも見つかりませんでした。すべての返信をありがとう。

私はウィキペディアで見つけました: ページの内部断片化 プロセスはまれに正確なページ数を使用する必要があります。その結果、最後のページは部分的に満杯になり、いくらかの量のメモリを無駄にすることになります。より大きなページサイズは、メモリの未使用部分がメインメモリにロードされる可能性が高いため、この方法で無駄なメモリの可能性を明らかに増加させます。ページサイズが小さくなると、割り当てに必要な実際のメモリ容量に近い値になります。 例として、ページサイズが1024KBであるとします。プロセスが1025KBを割り当てる場合は、2ページを使用する必要があります。その結果、1023KBの未使用領域が発生します(1ページは完全に1024KBを消費し、もう1ページは1KBのみ)。

それは私の質問の答えでした。とにかくありがとう。

答えて

4

一般的なアロケータの実装では、最初にオペレーティングシステムを呼び出して膨大なメモリブロックを取得し、要求を満たすためにそのメモリを与えます。サブ割り当てと呼ばれます。メモリが足りなくなると、オペレーティングシステムから多くの情報が得られます。

アロケータは、オペレーティングシステムから取得したすべての大きなブロックと、そのクライアントに渡したすべての小さなブロックを追跡する必要があります。また、クライアントからのブロックを受け入れる必要があります。

典型的なサブ割り当てアルゴリズムは、空きリストと呼ばれ、常に空きリストが空の場合のみ、メインブロックに行く、空きリストからの要求を満たすためにしようとする各サイズの返されたブロックのリストを保持します。この特定の実装手法は、平均的なプログラムでは非常に高速で非常に効率的ですが、要求サイズがすべての場所にある場合(ほとんどのプログラムでは通常ではありません)、壊滅的な断片化プロパティがあります。

GNUのmalloc実装のような現代的なアロケータは複雑ですが、何十年もの経験をもとに構築されているので、独自の特殊なアロケータを書く必要はほとんどありません。

+0

私のシステム(debianx64)では、ページサイズは4096バイトです。それを減らす可能性はありますか?私はメモリにたくさんの小さな断片を保存したいと思いますが、1バイトの予約でさえ、ここで1番目のメッセージに追加されたもののために別の4095を使用することはできません。それは本当ですか、私は間違っていますか? –

4

標準で指定されていないためマニュアルに記載されていません。つまり、ほとんどの場合xとyは並んでいます(先に進み、アドレスはcout<< hex <<)。

標準では何もこれを頼りにすることはできません。

1

各プロセスは、プロセスのアドレス空間に分割されている関連した異なるセグメント有する: 1)テキストセグメント::コードを 2)スタックセグメント::プロセススタック 3)データセグメントが配置されて::であります"new"によるメモリは予約されています。それに加えて、初期化済みおよび未初期化の静的データ(bssなど)も格納されます。

したがって、新しい関数(mallocを内部的に使用していると思いますが、新しいクラスでメモリを扱う方がずっと安全です)を呼び出すたびに、指定されたバイト数がデータセグメントに割り当てられます。 もちろん、プログラムを実行している間に印刷するアドレスは仮想であり、物理アドレスに変換する必要がありますが、それは私たちの頭痛ではなく、OSメモリ管理ユニットがそれを行います。

関連する問題