То, о чем вы спрашиваете, невозможно с функциями, предоставляемыми ISO C ++.
Однако на большинстве распространенных платформ резервирование физической ОЗУ возможно с использованием специфичных для платформы расширений c. Например, Linux предоставляет функцию mlock , а Microsoft Windows предоставляет функцию VirtualLock . Но для того, чтобы использовать эти функции, вы должны либо
- знать, какие страницы памяти распределитель по умолчанию использует для выделения памяти, что может быть запутанным и сложным, или
- используйте вашу собственную реализацию распределителя памяти, чтобы он мог сам вызывать
mlock
/ VirtualLock
всякий раз, когда он получает память от операционной системы.
Ваша собственная реализация памяти распределитель может быть таким же простым, как пересылка всего запроса на выделение памяти в ядро операционной системы, например, используя mmap на Linux или VirtualAllo c на Windows. Однако это имеет недостаток, заключающийся в том, что степень детализации всех запросов на выделение памяти равна размеру страницы памяти, которая в большинстве систем составляет не менее 4096 байт. Это означает, что даже очень маленькие запросы на выделение памяти размером в несколько байтов фактически займут 4096 байт памяти. Это было бы большой тратой памяти. Кроме того, в своем вопросе вы указали, что хотите предварительно выделить определенный объем памяти при запуске приложения, чтобы вы могли использовать эту память позже для удовлетворения меньших запросов на выделение памяти. Это невозможно сделать с помощью метода, описанного выше.
Следовательно, вы можете рассмотреть возможность использования «правильной» реализации распределителя памяти, которая способна удовлетворить несколько небольших запросов на выделение с использованием одной страницы памяти. См. этот список в Википедии для списка распространенных реализаций.
Тем не менее, то, что вы описываете, может быть проблемой XY , в зависимости от того, какую операционную систему вы используете . Например, в отличие от Windows, Linux обычно приводит к избыточному использованию памяти. Это означает, что ядро Linux позволит приложениям выделять больше памяти, чем фактически доступно, при условии, что большинство приложений не будут использовать всю запрошенную память. Следовательно, вызов std::malloc
или new
редко завершается ошибкой на Linux (но это все еще возможно, в зависимости от конфигурации ). Вместо этого в условиях нехватки памяти Linux убийца OOM (убийца нехватки памяти) начнет убивать процессы, которые занимают большой объем памяти, чтобы освободить память и поддерживать работу системы. .
По этой причине описанные выше методы, вероятно, будут работать на Microsoft Windows, но на Linux они могут быть контрпродуктивными, так как они сделают ваш процесс более вероятным стать жертвой OOM убийца.
Однако, даже если вы sh можете выполнить то, что хотите, используя методы, описанные выше, я обычно не рекомендую вам использовать эти методы, поскольку такое поведение несправедливо по отношению к другим процессам. в системе. Как правило, вам следует оставить задачу решать, какой процесс получает (быструю) физическую память, а какой процесс получает (медленное) пространство подкачки в операционной системе, поскольку операционная система может лучше справляться с справедливым распределением своих ресурсов между своими процессами.