2

私はmallocの実装に関するプレゼンテーションを読んでいましたが、スライド7では、スペースを節約するために、リージョンのサイズと可用性を1つの単語に保存することを提案しています。別の方法は、2つのワードを使用することです。これは、可用性ビットが0または1である必要があるだけなので、無駄です。

これは与えられた説明です:

  • ブロックが整列している場合、下位アドレスビットは常に0です。
  • なぜalways-0ビットを格納するのですか?
  • 割り当て/解放フラグとして使用してください!サイズワードを読み取るときは、このビットをマスクする必要があります

http://courses.engr.illinois.edu/cs241/sp2012/lectures/09-malloc.pdf

しかし、これがどのように機能し、Cでどのように実装できるのか、私は本当に理解していません。サイズ整数の1ビットが常に0であるのはなぜですか?

4

3 に答える 3

3
  • ブロックが整列している場合、下位アドレスビットは常に0です。

これは、それが何をしているのかを理解するための鍵です。多くのCPUでは、マルチバイトプリミティブ値をプリミティブのバイト数で割り切れるアドレスに格納する必要があります。16ビットプリミティブは偶数アドレスに格納する必要があります。32ビットintは4で割り切れるアドレスに格納する必要があります。奇数アドレスに対応するポインタを介してにアクセスしようとするintと、バスエラーが発生します。

そのようなシステムでmallocは、特定のCPUでサポートされているプリミティブを格納するのに適したアドレスを常に返す必要があります。したがって、CPUが32ビット整数をサポートしている場合、によって返されるすべてのアドレスはmallocで割り切れる必要があります4このようなアドレスは整列されていると言われます。準拠するために、malloc実装は、プログラムによって要求されたブロックのサイズを、最後に0〜3バイトで、長さを。で割り切れるサイズにし4ます。この決定の結果として、整列されたブロックのアドレスの最後の2ビットは常にゼロになります。の実装はmalloc、結果を呼び出し元に返す前に「マスクアウト」されている限り、これらのビットを独自の目的に使用できます。

于 2012-11-01T11:53:35.947 に答える
1

malloc(3)(Posixで指定)は

  • 新しいメモリブロックを返します。またはNULL失敗した場合。返されたポインタは、プログラム内の他のポインタのエイリアスではありません
  • 適切に配置されたメモリブロックを返します。配置の制約は、コンパイラー、ABI、およびプロセッサー固有です。(多くの場合、配置は2ワードである必要があります)。

サイズは常にゼロではありません。(実際には、ゼロになることはありません)。2ワードの倍数に切り上げて、最後のビットを使用済み/空きビットとして使用できます。

ただし、によって返されるポインタは、malloc適切に配置する必要があります(たとえば、8バイト)。したがって、下位3ビットはゼロであり、-edゾーンのバイト単位で割り当てられたサイズmallocは8バイトの倍数(に渡された要求サイズを超えるmalloc)であるため、最後の3ビットはゼロです(最後のビットは他の目的、例えば使用済み/空きビット)。

于 2012-11-01T11:47:53.720 に答える
1

Why is one bit of the size integer always 0?

これが紛らわしい理由はわかりますが、スライド7で彼らが言っていることではないと思います。彼らは下位アドレスビットが常に0であると言っています。

オブジェクトのメモリアドレスは特定の境界に揃えられます。つまり、オブジェクトはサイズの倍数のメモリアドレスに揃えられます。

したがって、64ビット整数は8バイト境界に揃えられます。0x7fff315470d8

ポインタが常に8バイト境界に揃えられている場合、下位3ビットは常にゼロです。すなわち:0x8 16 = 1000 2

基本的に、ポインタを逆参照する前にそれらを取り出す限り、それらの下位ビットに好きなものを貼り付けることができます。64ビットの場合、常に0である3ビットがあるため、3つの「フラグ」を格納できます。このパワーポイントの場合、彼らはその最下位ビットを取り、それを「割り当てられた」フラグに使用すると言っています。メモリが割り当てられている限り、1を挿入し、ポインタをユーザーに送信するときにマスクします。

于 2012-11-01T12:11:05.863 に答える