Pregunta

Me gustaría saber qué método se recomienda en la programación de Windows C: usar malloc o la función Win32 HeapAlloc (¿quizás VirtualAlloc?).

He leído el MSDN Funciones de administración de memoria artículo y los artículos de MSDN relacionados con malloc y HeapAlloc, pero no dicen cuál se debe usar y en qué situaciones.

¿Fue útil?

Solución

Sigue con malloc a menos que tengas una razón convincente para usar algo diferente. Se implementará por debajo en términos de las primitivas de asignación de memoria del sistema operativo, pero no hay ninguna ventaja real al bucear hacia esa capa.

Algunas llamadas a la API, creo que necesitan un bloque de memoria asignado desde un montón de Windows, pero sabrás cuando las encuentres.

O si desea hacer algo más avanzado, como usar la memoria compartida, o si necesita controlar los permisos en las páginas de memoria directamente, tendrá que ver las llamadas a la API de Windows como VirtualAlloc.

Otros consejos

VirtualAlloc y sus amigos pueden brindarle un poco de ventaja si tiene un montón de datos para procesar o si necesita tomarse la molestia de crear su propio administrador de memoria de todos modos.

De lo contrario, es más fácil y, por supuesto, más portátil que usar malloc ().

VirtualAlloc tiene esta característica ingeniosa llamada MEM_RESET, que invalida los datos en un bloque de memoria, pero los mantiene asignados. Esto significa que si se envía al disco, Windows no se molestará en volver a buscarlo la próxima vez que acceda a él. Es bueno si tienes muchos megas de datos que de repente pueden volverse innecesarios, pero pronto tendrás algo más para llenar el búfer.

También diferencia entre reservar espacio de direcciones y solicitar memoria. Hay algunas cosas buenas allí si tienes una buena razón para ir a tantos problemas.

Una cosa más: se garantiza que malloc () es portátil (al menos para cualquier implementación ANSI-C) y más elegante.

En algunas situaciones que utilizan funciones como HeapAlloc, HeapFree hará que tu vida sea más fácil. Un ejemplo sería: una gran aplicación en la que necesita asignar memoria en un módulo (por ejemplo, en library1.dll) y liberar esa memoria en el módulo principal (por ejemplo, program.exe). Esto se puede hacer de manera segura si está usando las funciones HeapAlloc, HeapResize y HeapFree, pero no se puede hacer usando la biblioteca de tiempo de ejecución de C (por ejemplo, malloc, libre, redimensionar).

PERO: Si no tienes una buena razón, debes seguir con las funciones malloc / free / resize. Además, si necesita cambiar los permisos de la memoria asignada (por ejemplo: para hacer si es ejecutable, etc.), debe usar funciones como VirtualAlloc, VirtualFree.

Podrías hacer una envoltura y dejar la opción para cambiar los detalles de la implementación. Incluso podría comparar ambas opciones con su código y luego decidir.

A diferencia de Rob, voy por el otro camino ... Ya que elegí codificar contra WinAPI, uso las funciones nativas en lugar de las C en tiempo de ejecución, que de todos modos son solo una envoltura delgada.

Con HeapAlloc puede tener montones separados para diferentes tareas / subsistemas. Esto puede simplificar el análisis de volcado de aplicaciones grandes.

Con malloc solo puede usar un montón, pero obtiene algunas optimizaciones de asignación que los autores de CRT pueden haber implementado en la parte superior de OS HeapAlloc.

Bajar a VirtualAlloc no le compra mucho, a menos que quiera implementar un gestor de pila personalizado (su propio conjunto de funciones Heap *).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top