4

そのようなことはありますか?可能な場合は移動せずにメモリを再割り当てするか、不可能な場合は何もしない関数を意味します。Visual C には、私が望むことを行う _expand があります。他のプラットフォーム、特に gcc/linux の同等物について知っている人はいますか? 私は主に、可能な場合はメモリをその場で縮小することに関心があります (また、誰かが尋ねた場合に備えて、標準の realloc はサイズが小さくなってもメモリを移動する可能性があります)。

これを行うための標準的な方法がないことはわかっており、実装に依存する汚いハックのトリックを明示的に求めています。どこかで機能することを知っているものをすべて挙げてください。

4

2 に答える 2

2

mmapandを使用しmunmapて必要のない余分な部分を排除する (またはmremap、同じことができますが非標準である) 以外に、割り当てられたメモリ ブロックのサイズを減らす方法はありません。またmmap、ページの粒度 (通常は 4k) があるため、非常に大きなオブジェクトを扱っていない限り、大きすぎるオブジェクトをそのままにしてまったく縮小しないよりも、それを使用する方が悪いでしょう。

そうは言っても、解放されたメモリがひどく断片化されるため、メモリをその場で縮小することはおそらく良い考えではありません。適切なrealloc実装では、メモリを最適化する機会として、ブロックを大幅に縮小するときにブロックを移動する必要があります。

あなたの状況は、ポインターを保持している他の多くの構造を持つメモリの割り当てられたブロックがあり、それらのポインターを無効にしたくないということだと思います。この場合、考えられる一般的な解決策は次のとおりです。

  1. サイズ変更可能なオブジェクトを 2 つの割り当てに分割します。2 番目の可変サイズ オブジェクトを指す固定サイズの「ヘッド」オブジェクトです。
  2. 可変サイズ オブジェクトを指す必要がある他のオブジェクトについては、 head オブジェクトへのポインターと整数オフセット(または) を可変サイズ オブジェクトに格納します。size_tptrdiff_t

これで、可変サイズ オブジェクトが新しいアドレスに移動しても、そのオブジェクトへの参照は無効になりません。

複数のスレッドからこれらのオブジェクトを使用している場合は、head オブジェクトに読み取り/書き込みロックを設定し、可変サイズのオブジェクトにアクセスする必要があるときはいつでも読み取りロックし、可変サイズのオブジェクトのサイズを変更するたびに書き込みロックする必要があります。物体。

于 2011-02-07T20:28:50.170 に答える
1

同様の質問が別のフォーラムで尋ねられました。私が見たより合理的な答えの 1 つはmmap、初期割り当てに (フラグを使用して) 使用し、フラグを使用せずMAP_ANONYMOUS呼び出すことでした。ただし、このアプローチの制限は、割り当てサイズがシステムのページ サイズの正確な倍数でなければならないことです。mremap MREMAP_MAYMOVE

于 2009-09-04T05:01:26.900 に答える