Comparación de métodos de asignación de memoria
A continuación se muestra una breve comparación de los distintos métodos de asignación de memoria:
- CoTaskMemAlloc
- GlobalAlloc
- HeapAlloc
- LocalAlloc
- malloc
- new
- VirtualAlloc
Aunque las funciones GlobalAlloc, LocalAlloc y HeapAlloc asignan en última instancia memoria del mismo montón, cada una proporciona un conjunto ligeramente diferente de funcionalidad. Por ejemplo, se puede indicar a HeapAlloc que genere una excepción si no se pudo asignar memoria, una funcionalidad que no está disponible con LocalAlloc. LocalAlloc admite la asignación de identificadores que permiten mover la memoria subyacente mediante una reasignación sin cambiar el valor de identificador, una funcionalidad no disponible con HeapAlloc.
A partir de Windows de 32 bits, GlobalAlloc y LocalAlloc se implementan como funciones contenedoras que llaman a HeapAlloc mediante un identificador para el montón predeterminado del proceso. Por lo tanto, GlobalAlloc y LocalAlloc tienen una sobrecarga mayor que HeapAlloc.
Dado que los diferentes asignadores de montón proporcionan una funcionalidad distintiva mediante diferentes mecanismos, debe liberar memoria con la función correcta. Por ejemplo, la memoria asignada con HeapAlloc debe liberarse con HeapFree y no LocalFree o GlobalFree. La memoria asignada con GlobalAlloc o LocalAlloc debe consultarse, validarse y liberarse con la función global o local correspondiente.
La función VirtualAlloc permite especificar opciones adicionales para la asignación de memoria. Sin embargo, sus asignaciones usan una granularidad de página, por lo que el uso de VirtualAlloc puede dar lugar a un mayor uso de memoria.
La función malloc tiene la desventaja de depender del tiempo de ejecución. El nuevo operador tiene la desventaja de ser dependiente del compilador y dependiente del lenguaje.
La función CoTaskMemAlloc tiene la ventaja de funcionar bien en C, C++o Visual Basic. También es la única manera de compartir memoria en una aplicación basada en COM, ya que MIDL usa CoTaskMemAlloc y CoTaskMemFree para serializar la memoria.
Ejemplos
Temas relacionados