Сравнение методов выделения памяти
Ниже приведено краткое сравнение различных методов выделения памяти.
- CoTaskMemAlloc
- GlobalAlloc
- HeapAlloc
- LocalAlloc
- malloc
- new
- VirtualAlloc
Хотя функции 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 для маршалинга памяти.
Примеры
Связанные темы