free
およびmalloc
を使用してください。これにより断片化の問題は発生しません。
現代のアロケータは、メモリの断片化にかなり抵抗しています。最近では、断片化の問題を引き起こすためにかなり病理学的なプログラムが必要です。断片化は、私たちのプログラムが物理RAMを直接アドレス指定した場合にはより深刻な問題でしたが、仮想メモリを使用すると、プログラムのヒープ内の大きな穴がリソースを消費する必要はありません。
さらに、バッファのサイズのために、ほとんどのアロケータは、各バッファの専用領域をカーネルから要求します。 Linux/OS X/BSDでは、これは各バッファのの舞台裏で匿名のmmap
を意味します。これはアドレス空間の断片化を引き起こす可能性がありますが、仮想アドレス空間は基本的に64ビットシステムでは使用できません。また、数百メガは32ビットでも問題ありません。
free
とmalloc
を使用してください。
代替:各バッファを必要以上に大きくする方が早いかもしれません。 malloc
の方法は、現代のUnix上で動作します。書き込まないページはメモリを消費しません。
malloc
500 MBのバッファーで、最初の100 MBしか使用しない場合は、malloc
100 MBのバッファーを使用した場合と比べてプログラムで実際に使用されるメモリが実際より多くなりません。このようにアドレススペースの断片化が増えますが、これは64ビットシステムでは問題にはならず、割り当てサイズを常に調整して32ビットシステムでも動作させることができます。 mmap
を使用するための提案については
、ちょうど(1 MIBは共通のしきい値である)、それは大規模な配分のためにあるものである、mmap
/munmap
にシンプルなインターフェイスとしてmalloc
/free
を考えます。
"手前にメモリを予約して他の問題が発生する"プール用アロケータは適切ではありませんか?そして、あなたは標準のままにしたいと思っていますか、カスタム割り当て方式のアプローチを探していますか? – Corbin
@Corbinプールは私の場合は良いとは思わない - LinuxはNUMA domanisでファーストタッチポリシーを持っている。私は、あなたがサイズ変更の必要を避けることができるように、バッファ内のデータを管理するための方法* portable * solution – Anycorn
に泊まりたいですか?またはバッファサイズに上限を置くことさえできますか?どのくらいのメモリをハードウェアに搭載する予定ですか? –