mmap
andを使用しmunmap
て必要のない余分な部分を排除する (またはmremap
、同じことができますが非標準である) 以外に、割り当てられたメモリ ブロックのサイズを減らす方法はありません。またmmap
、ページの粒度 (通常は 4k) があるため、非常に大きなオブジェクトを扱っていない限り、大きすぎるオブジェクトをそのままにしてまったく縮小しないよりも、それを使用する方が悪いでしょう。
そうは言っても、解放されたメモリがひどく断片化されるため、メモリをその場で縮小することはおそらく良い考えではありません。適切なrealloc
実装では、メモリを最適化する機会として、ブロックを大幅に縮小するときにブロックを移動する必要があります。
あなたの状況は、ポインターを保持している他の多くの構造を持つメモリの割り当てられたブロックがあり、それらのポインターを無効にしたくないということだと思います。この場合、考えられる一般的な解決策は次のとおりです。
- サイズ変更可能なオブジェクトを 2 つの割り当てに分割します。2 番目の可変サイズ オブジェクトを指す固定サイズの「ヘッド」オブジェクトです。
- 可変サイズ オブジェクトを指す必要がある他のオブジェクトについては、 head オブジェクトへのポインターと整数オフセット(または) を可変サイズ オブジェクトに格納します。
size_t
ptrdiff_t
これで、可変サイズ オブジェクトが新しいアドレスに移動しても、そのオブジェクトへの参照は無効になりません。
複数のスレッドからこれらのオブジェクトを使用している場合は、head オブジェクトに読み取り/書き込みロックを設定し、可変サイズのオブジェクトにアクセスする必要があるときはいつでも読み取りロックし、可変サイズのオブジェクトのサイズを変更するたびに書き込みロックする必要があります。物体。