В Linux, BSD или OS X используйте malloc
. Я думаю, что популярная реализация «jemalloc» во FreeBSD использует выделенный mmap
для каждого региона 1 МБ или больше. Меньшие регионы по-прежнему поддерживаются mmap
, поэтому они по-прежнему обеспечивают большую часть того же поведения, но когда вы free
меньшие регионы, вы автоматически не отобразите их. Я думаю. Реализация glibc "dlmalloc", которая используется в Linux, также использует выделенный mmap
для выделения по крайней мере 1 МБ, но я думаю, что он использует sbrk
для небольших регионов. Malloc для Mac OS X также использует mmap
, но я не уверен насчет конкретных параметров.
Указатель, полученный из большого malloc
, будет указывать на общую страницу в ОЗУ, заполненную нулевыми байтами. Как только вы пишете на страницу в этом регионе, новая страница в физической памяти будет выделена и заполнена нулевыми байтами. Итак, вы видите, поведение по умолчанию malloc
уже ленивое. Дело не в том, что страницы меняются местами с самого начала, а в том, что их там даже нет.
Если вы закончили с данными в регионе, вы можете использовать madvise
с MADV_FREE
. Это говорит ядру, что оно может освободить связанные страницы вместо их замены. Страницы остаются действительными, и как только вы напишите им, они превратятся в обычные страницы. Это как звонить free
, а затем malloc
.
Резюме: просто используйте malloc
. Он делает то, что вы хотите.