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

Ниже приведено краткое сравнение различных методов выделения памяти.

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

Начиная с 32-разрядной версии Windows, GlobalAlloc и LocalAlloc реализуются как функции-оболочки, которые вызывают HeapAlloc с помощью дескриптора к куче процесса по умолчанию. Таким образом, globalAlloc и LocalAlloc имеют большую нагрузку, чем HeapAlloc.

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

Функция VirtualAlloc позволяет указать дополнительные параметры выделения памяти. Однако при выделении страниц используется степень детализации, поэтому использование VirtualAlloc может привести к более высокому использованию памяти.

Функция malloc имеет недостаток, так как зависит от времени выполнения. У нового оператора есть недостаток, зависящий от компилятора и языка.

Функция CoTaskMemAlloc имеет преимущество в том, что она хорошо работает в C, C++ или Visual Basic. Кроме того, это единственный способ совместного использования памяти в приложении на основе COM, так как MIDL использует CoTaskMemAlloc и CoTaskMemFree для маршалинга памяти.

Примеры

Глобальные и локальные функции

Функции кучи

Функции виртуальной памяти