私が知っているオブジェクトサイズトラッキングの主な2つの方法は、側面にあるメタデータを持つサイズ分離アロケータ(Kingsleyスタイルのアロケータなど)に暗黙的に含まれているか、オブジェクトの前にサイズを固定することですオブジェクトヘッダー(例:dlmalloc)。かなりひどい第三の解決策は、割り当てられたすべてのオブジェクトとそのサイズのマップを維持することです。もちろん、そのマップは別のアロケータによって管理されます。
私はあなたが正しい軌道に乗っていると思います。あなたが整列の考慮事項を認識していることは良いことです。私は、mt_allocに関する情報を参照して、選択肢や驚きがあるかどうかを調べようとしましたが、そのような情報はすぐには出てこないようです。いくつかのアロケータには、オブジェクトサイズを問い合わせるメソッドがあります(これは安価かもしれません)。 deallocate関数がサイズを明示的に渡す必要がある場合、そのような関数は存在しないと推測しますが、あなたは決して知りません。
アラインメントが重要な場合、アロケータはおそらくメモリが適切に整列して返されないため、計算を微調整する必要があります。あなたが返されるポインタのアライメントについて何も知らない場合は、あなたが何か必要があります。mt_allocは内部ポインタ上のオブジェクトを解放耐えることができない場合は
struct object_header {
size_t size;
};
void * buf = xxmalloc (2 * alignment + size + sizeof(object_header));
void * alignedPtr = (void *) (((size_t) buf + sizeof(object_header) + alignment - 1) & ~(alignment - 1));
を、このスキームは、あるため、アライメントのための余分なスペースをパディングすることにより、あなたのための問題を提起します返された元の住所はもはやわかりません。その場合は、ヘッダーに余分なフィールドを格納する必要があります。
mt_allocがメモリを内部的に管理する方法によっては、余分なヘッダーをタックすると相当なオーバーヘッドが発生する可能性があります。サイズを分離したアロケータでは、このヘッダーをタックすることで、最大でページサイズまでのオブジェクトに対して2倍のスペースオーバーヘッドを与えることができます。このとき、オブジェクトごとに余分なページのコストを支払うことができます。他のアロケータでは、これは問題ではないかもしれませんが、それは目を引くものです。
コンテナは、ますます大きなチャンクにメモリを割り当て、サイズが小さくなったときのメモリはすべて保持します。あなたのCライブラリはおそらく同じ使用パターンを持っていないでしょうから、コンテナと同じパフォーマンスの向上さえ見られないかもしれません。 –
@Emile:サイズを把握するために考えていたのは、チャンクのサイズを格納するために余分なスペースを割り当てることでした。したがって、nバイトが要求された場合は、n + sizeof(std :: size_t)(+配列の考慮事項)のようなものを割り当て、ベースアドレス+ sizeof(std :: size_t)を返します。ポインタpを解放するときは、p - sizeof(std :: size_t)をとり、サイズを読み込んでdeallocate()に渡します。 – bluescarni
ええ、私はあなたの質問を読んだときに何とかそれを逃しました。 ADDである必要があります。 :-) –