malloc /implementación libre

  
        

malloc /libre aplicación

Chunk
unidades de gestión de biblioteca montón estándar

C en la asignación básica está fuera trozo, trozo es un concepto lógico, su estructura de datos es como sigue:

struct {malloc_chunk

size_t prev_size;

size_t tamaño;

struct malloc_chunk * fd;

struct malloc_chunk * bk;

struct malloc_chunk * fd_nextsize;

struct malloc_chunk * bk_nextsize;

};

Si una parte es un estado libre, que constituye el fd y bk un par de lista enlazada, los registros que se han de memoria libre para el usuario, de modo que más tarde puede ser asignado o se fusionaron en un gran bloque libre de aquí directamente después de la redistribución. Si una parte ha sido alloc, a continuación, esta vez de después de que el tamaño no es datos de usuario significativas, es decir, fd, libro, etc., esto es fácil de ver en los comentarios.

Cuando una parte se asigna a cabo, el tamaño registrado en este trozo de hecho asigna al tamaño de la memoria del programa de usuario, es decir, los valores de los parámetros cuando llamamos malloc y prev_size registro es adyacente a la porción actual el tamaño de un trozo. La razón de este diseño es rápidamente localizar /fusión ejemplo trozo adyacente, si la dirección de la porción corriente char * p, entonces las flechas arriba /abajo, respectivamente, de un trozo de direcciones es PP- >. Prev_size y p + p > tamaño . análisis de los siguientes dos macros simples se convierte en claro:

(1) para dar al usuario un puntero (es decir, donde SIZE_SZ sizeof (size_t))

#define chunk2mem (p) de la porción (( void_t *) ((char *) (p) + 2 * SIZE_SZ))

(2) la dirección del trozo obtenido

#define mem2chunk (MEM) ((mchunkptr puntero desde el usuario) (( char *) (MEM) - 2 * SIZE_SZ))

cuando la asignación de memoria, la unidad que es 8Byte trozo, los tres inferiores bits son 0 en este tamaño, que puede ser utilizado para otros fines. Tiene dos definiciones en el glibc:

#define PREV_INUSE 0x1

#define IS_MMAPPED 0x2

Aquí PREV_INUSE registrada de si se utiliza un trozo (si se ha asignado era 1), e identificar el fragmento actual IS_MMAPPED si obtenido por distribución MMAP. Los siguientes macros pueden profundizar nuestra comprensión de la parte de:

//Obtener el trozo actual (p) de la siguiente parte

#define next_chunk (p) ((mchunkptr) (((char * ) (p)) + ((p) - > tamaño de &~ PREV_INUSE)))

//obtener el trozo actual (p) en un trozo

#define prev_chunk (p ) ((mchunkptr) (((char *) (p)) - ((p) - > prev_size)))

//determina si el trozo actual (p) se utiliza o no, nota: p es inuse el siguiente bit de información adyacente almacenado en el tamaño del fragmento en

#define inuse (p) ((((mchunkptr) (((char *) (p)) + ((p) - > size &~ PREV_INUSE))) - > tamaño) &PREV_INUSE)

//trozo actual (P) dispuestos para ser utilizado, es decir, el bit menos significativo de la siguiente adyacente al tamaño de fragmento es 1

set_inuse #define (p) ((mchunkptr) (((char *) (p)) + ((p) - > tamaño de &~ PREV_INUSE))) - > tamaño

Copyright © Conocimiento de Windows All Rights Reserved