Если бы глобальная горячая клавиша была бы достаточна, то RegisterHotKey добился бы цели
Для malloc не так много накладных расходов, поэтому вы вряд ли сможете добиться экономии времени выполнения. Однако есть веская причина реализовать распределитель поверх malloc, а именно - иметь возможность отслеживать утечки памяти. Например, вы можете освободить всю память, выделенную программой при ее выходе, а затем проверить, вызывает ли ваш распределитель памяти баланс (то есть такое же количество вызовов для выделения / освобождения).
Для вашей конкретной реализации нет причин для free (), поскольку malloc не освобождает системную память, и поэтому он будет освобождать память только вашему собственному распределителю.
Другая причина для использования пользовательского распределителя - это что вы можете выделять много объектов одинакового размера (т. е. у вас есть некоторая структура данных, которую вы выделяете много). Вы можете вести отдельный список свободных мест для этого типа объектов и освобождать / выделять только из этого специального списка. Преимущество этого заключается в том, что это позволяет избежать фрагментации памяти.
Это полностью зависит от реализации. В Windows программы VC ++ могут возвращать память обратно в систему, если соответствующие страницы памяти содержат только свободные блоки.
Я думаю, что у вас есть вся необходимая информация, чтобы ответить на свой вопрос. pmap показывает память, которая в данный момент используется процессом. Итак, если вы вызовете pmap до того, как процесс достигнет пикового объема памяти, то он не покажет пиковую память. если вы вызовете pmap непосредственно перед завершением процесса, он покажет пиковую память для процесса, который не использует mmap. Если процесс использует mmap, то при вызове pmap в точке, где используется максимальная память, будет отображаться пиковое использование памяти, но эта точка может быть не в конце процесса (это может произойти где угодно).
Это применимо только к вашей текущей системе (т. Е. На основе документации, которую вы предоставили бесплатно, а также mmap и malloc), но, как было заявлено на предыдущем плакате, их поведение зависит от внедрения.
Это немного варьируется от реализации к реализации.
Думайте о своей памяти как о большом длинном блоке, когда вы выделяете ему, вы забираете немного своей памяти (помечено как «1» ниже):
111
Если я выделю больше памяти с помощью malloc, она получит часть от системы:
1112222
Если я теперь освобожу '1':
___2222
Она не будет возвращена в систему, потому что два впереди из него (а память дана как непрерывный блок). Однако, если конец памяти освобожден, эта память возвращается в систему. Если бы я освободил «2» вместо «1». Я бы получил:
111
бит, на котором было «2», будет возвращен в систему. Основное преимущество освобождения памяти состоит в том, что этот бит затем можно перераспределить, а не получать больше памяти из системы. например:
33_2222
Вот некоторые «преимущества» того, чтобы никогда не возвращать память обратно в систему:
Я считаю, что распределитель памяти в glibc может возвращать память обратно в систему, но будет это или нет, зависит от ваших шаблонов распределения памяти.
Скажем так. вы делаете что-то вроде этого:
void *pointers[10000];
for(i = 0; i < 10000; i++)
pointers[i] = malloc(1024);
for(i = 0; i < 9999; i++)
free(pointers[i]);
Единственная часть кучи, которую можно безопасно вернуть в систему, - это «кусок дикой природы», который находится в конце кучи. Это можно вернуть в систему с помощью другого системного вызова sbrk, и распределитель памяти glibc сделает это, когда размер этого последнего фрагмента превысит некоторый порог.
Вышеупомянутая программа сделает 10000 небольших выделений, но освободит только первые 9999 их. Последний должен (при условии, что ничто другое не вызвало malloc, что маловероятно) должно располагаться прямо в конце кучи. Это помешает распределителю вообще вернуть в систему какую-либо память.
Многие менеджеры памяти могут выполнять операции TRIM, возвращая полностью неиспользуемые блоки памяти. к ОС. Однако, как уже упоминалось в нескольких сообщениях, это полностью зависит от реализации.
Но, допустим, я никогда не прошу выделения размера больше, чем, скажем, 50 байт, и я запрашиваю много таких 50-байтовых объектов при пиковой нагрузке на систему. Что тогда?
Это зависит от вашего шаблона распределения. Освобождаете ли вы ВСЕ небольших выделений? Если это так и если диспетчер памяти обрабатывает выделение небольшого блока, это может быть возможно. Однако, если вы выделяете много мелких предметов, а затем высвобождаете только все, кроме нескольких разбросанных предметов, вы можете фрагментировать память и сделать невозможным TRIM-блоки, так как каждый блок будет иметь только несколько разрозненных распределений. В этом случае вы можете захотеть использовать другую схему распределения для временных и постоянных выделений, чтобы вы могли вернуть временные выделения обратно в ОС.