Tengo una pregunta simple sobre el heap y malloc :
Cuando asignamos algo de espacio de memoria usando malloc de la siguiente manera:
int *p; p = (int*) malloc (10*sizeof(int));En realidad, asigna 10 palabras en el montón. Sin embargo, mi pregunta es:
¿El espacio de memoria real utilizado es realmente de 10 palabras?
¿O se necesita otro espacio adicional para almacenar el valor del tamaño de la memoria?
O, incluso, debido a que el montón está estructurado como una lista enlazada , ¿se está utilizando otro espacio de memoria para almacenar la dirección que apunta al siguiente nodo de la lista en el montón?
Es completamente dependiente de la implementación.
a) Podría tener algunos bytes antes de cada nodo asignado que contiene el tamaño del nodo, el puntero al siguiente nodo y tal vez un puntero de nodo anterior y el tipo de nodo.
b) El artículo devuelto no puede tener nada más alrededor que otras asignaciones. Una estructura en otro lugar realiza un seguimiento de lo que se asigna y lo que está libre, quizás mediante un mapa de bits o una lista paralela en miniatura.
c) Otra variación proporciona varias matrices de fragmentos de tamaño fijo. Una matriz puede proporcionar bloques de 32 bytes; otros bloques de 128 bytes, etc. Un mapa de bits para cada matriz gestiona las asignaciones.
d) La implementación más mínima que he visto ignora completamente free() (es decir, free() no tiene ninguna operación) y asigna la siguiente pieza del grupo en cada malloc() .
Con mucho, la técnica moderna más utilizada es un . La variante b se usa en muchos sistemas de archivos como NTFS y FAT. La opción c fue/es favorecida en muchos sistemas operativos DEC, especialmente para el uso del kernel. La opción d es utilizada por algunos entornos integrados minimalistas con una advertencia adecuada.
En la mayoría de las implementaciones, la asignación solicitada se redondea a algún múltiplo natural (generalmente de 2, 8, 16, etc.) conveniente para el algoritmo. Entonces, una serie de asignaciones de 5, 3, 8, 7, 4, 1 y 15 podría considerarse cada una como una solicitud de 16 bytes.
La asignación de memoria depende de las bibliotecas del compilador y del sistema operativo.
Ambos idiomas no establecen una cantidad máxima de memoria que se puede asignar. Todo lo que tiene garantizado es el tamaño solicitado.
Entonces, si hay alguna memoria adicional asignada, dependería de la plataforma.
Además, puede haber menos gastos generales al asignar espacios más grandes.
Intente escribir su propio asignador de memoria y vea qué se necesita, especialmente al desechar la memoria.
Sí, es posible que una implementación de malloc realmente asigne un poco más de memoria de la que solicitó, almacene el tamaño de la memoria asignada al comienzo de la memoria asignada y luego le brinde un puntero a la siguiente dirección de memoria inmediata. Cuando llame a free en ese puntero, el asignador retrocederá un poco, leerá el tamaño del búfer y calculará cuánto necesita liberar realmente.
Pero, por supuesto, otra posible implementación podría mantener una lista, o un diccionario, o hacer algo completamente diferente bajo el capó, siempre que le proporcione el mismo comportamiento especificado.