0

ここで、これらの命令がどのようにメモリを割り当てているかを説明します。

たとえば、コードを取得した場合はどうなりますか?

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

それらが割り当てられている場合、RAMで実際にどのように見えるか?ブロック全体が各変数用に予約されていますか、またはブロック(メモリページまたはhow-you-call-it-32ビットで4KBのサイズ)が2つの変数で共有されていますか?

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

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

そしてそれが私の質問に対する答えでした。とにかくみんなありがとう。

4

3 に答える 3

4

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

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

一般的なサブ割り当てアルゴリズムは、フリーリストと呼ばれる各サイズの返されたブロックのリストを保持し、常にフリーリストからの要求を満たそうとします。フリーリストが空の場合にのみメインブロックに移動します。この特定の実装手法は、平均的なプログラムでは非常に高速で非常に効率的ですが、リクエストサイズがいたるところにある場合は、ひどい断片化特性があります(ほとんどのプログラムでは通常ではありません)。

GNUのmalloc実装のような最新のアロケータは複雑ですが、何十年にもわたる経験を持って構築されており、独自の特殊なサブアロケータを作成する必要が非常に少ないほど優れていると見なす必要があります。

于 2010-12-12T09:20:26.963 に答える
4

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

しかし、標準にはこれを強制するものはないので、信頼することはできません。

于 2010-12-12T08:53:01.220 に答える
1

各プロセスには、プロセスアドレス空間間で分割された異なるセグメントが関連付けられています:1)テキストセグメント::コードが配置される場所2)スタックセグメント::プロセススタック3)データセグメント::これは「新規」によるメモリが存在する場所です予約済み。さらに、初期化された静的データと初期化されていない静的データ(bssなど)も格納されます。

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

于 2010-12-12T09:00:02.560 に答える