Поделиться через


Функции кучи

Каждый процесс имеет кучу по умолчанию, предоставляемую системой. Приложения, которые делают частые выделения из кучи, могут повысить производительность с помощью частных кучи.

Частная куча — это блок одной или нескольких страниц в адресном пространстве вызывающего процесса. После создания частной кучы процесс использует такие функции, как HeapAlloc и HeapFree для управления памятью в этой куче.

Функции кучи также можно использовать для управления памятью в куче по умолчанию процесса с помощью дескриптора, возвращаемого функцией GetProcessHeap. Новые приложения должны использовать функции кучи вместо глобальных и локальных функций для этой цели.

Нет разницы между памятью, выделенной из частной кучи и выделенной с помощью других функций выделения памяти. Полный список функций см. в таблице функции управления памятью.

Заметка

Поток должен вызывать функции кучи только для кучи по умолчанию и частных куч, создаваемых потоком, с помощью дескрипторов, возвращаемых функцией GetProcessHeap или HeapCreate.

 

Функция HeapCreate создает частный объект кучи, из которого вызывающий процесс может выделить блоки памяти с помощью функции HeapAlloc. HeapCreate указывает как начальный размер, так и максимальный размер кучи. Начальный размер определяет количество зафиксированных и записываемых страниц, изначально выделенных для кучи. Максимальный размер определяет общее количество зарезервированных страниц. Эти страницы создают непрерывный блок в виртуальном адресном пространстве процесса, в котором куча может расти. Дополнительные страницы автоматически фиксируются из этого зарезервированного пространства, если запросы HeapAlloc превышают текущий размер зафиксированных страниц, если для него доступно физическое хранилище. После фиксации страниц они не удаляются до завершения процесса или до тех пор, пока куча не будет уничтожена путем вызова функции HeapDezor.

Память частного объекта кучи доступна только для созданного процесса. Если библиотека динамической компоновки (DLL) создает частную кучу, она делает это в адресном пространстве процесса, вызываемого библиотекой DLL. Он доступен только для этого процесса.

Функция HeapAlloc выделяет указанное количество байтов из частной кучи и возвращает указатель на выделенный блок. Этот указатель можно использовать в heapFree, HeapReAlloc, HeapSizeи функции HeapValidate.

Память, выделенная HeapAlloc, не перемещается. Адрес, возвращаемый HeapAlloc, действителен, пока блок памяти не будет освобожден или перераспределен; Блок памяти не должен быть заблокирован.

Так как система не может сжимать частную кучу, она может стать фрагментированной. Приложения, которые выделяют большие объемы памяти в различных размерах выделения, могут использовать кучу с низкой фрагментацией для уменьшения фрагментации кучи.

Возможное использование функций кучи — создать частную кучу при запуске процесса, указав начальный размер, достаточный для удовлетворения требований к памяти процесса. Если вызов функции HeapCreate завершается, процесс может завершиться или уведомить пользователя о нехватке памяти; Однако при успешном завершении процесс гарантирует наличие необходимой памяти.

Память, запрошенная HeapCreate, может быть несоотложна. Память, выделенная в куче heapAlloc, является непрерывной. Вы не должны записывать в память или считывать из памяти в куче, за исключением того, что выделено HeapAlloc, и не следует предполагать никакой связи между двумя областями памяти, выделенными HeapAlloc.

Вы не должны ссылаться на память, освобожденную HeapFree. После освобождения памяти все сведения, которые, возможно, были в нем, ушли навсегда. Если требуется информация, не освобождайте память, содержащую сведения. Вызовы функций, возвращающие сведения о памяти (например, HeapSize) не могут использоваться с освобожденной памятью, так как они могут возвращать нефиксированные данные.

Функция ХеапДестрой уничтожает частный кучи. Он удаляет и освобождает все страницы объекта кучи, и он делает дескриптор кучи недействительным.

сравнение методов выделения памяти