Я читаю исходный код Google TCMalloc (портирование Windows).
int getpagesize()
{
static int pagesize = 0;
if (pagesize == 0)
{
SYSTEM_INFO system_info;
GetSystemInfo(&system_info);
pagesize = std::max(system_info.dwPageSize, system_info.dwAllocationGranularity);
}
return pagesize;
}
Как вы можете увидеть в фрагменте кода выше pagesize
(то есть единица выделения) рассчитывается как максимальное значение между dwPageSize и dwAllocationGranularity.
То, что я хочу знать, — это тип отношений между этими двумя значениями: необходимо ли рассчитывать значение так, как это объяснено выше? И есть ли ситуации, в которых dwPageSize может быть больше, чем dwAllocationGranularity?
Отказ от ответственности: Этот ответ основан не на какой-либо документации, а только на моей интерпретации этих констант.
Я предполагаю, что размер страницы указан правильно. Я предполагаю, что гранулярность выделения относится к гранулярности интерфейса выделения памяти ОС.
Есть два случая для рассмотрения:
гранулярность выделения больше размера страницы. Выделение блока памяти размером с страницу в таком случае приведет к фактически большему выделению ресурсов, поэтому его следует избегать.
гранулярность выделения меньше размера страницы. Выделение блока памяти размером гранулярности выделения все равно приведет к выделению / отображению всей страницы, поэтому это следует предотвратить.
По сути, в обоих случаях ОС будет выделять больше памяти, чем запрошено. Используя максимум, этого можно избежать, так что код выделения (пользовательского пространства) может быть (относительно) определенным относительно его фактического использования памяти.
Других решений пока нет …