unidos tirar tiradero servicio sacar recolección recoleccion que pasa para estados dompe dias debe cuando cerca basura c compiler-construction garbage-collection

tirar - Recolección de basura al compilar a C



servicio de recolección de basura (1)

Potencialmente, cada vez que se llama a una función, debe guardar las variables locales en una estructura de datos.

No, no puede. Puede dejar las variables locales en la pila de C y aún así iterarlas: coloque todas las variables de referencia en una matriz y agregue un puntero a la lista vinculada a la que agrega un nodo al ingresar un nuevo marco de la pila.

Bosquejo:

struct vm { struct scope *root; }; struct scope { struct scope *prev, *next; size_t size; struct ref *refs; }; void foo(struct vm *vm, struct scope *caller) { struct ref local_refs[42]; struct scope scope = { caller, NULL, sizeof local_refs / sizeof *local_refs, local_refs }; caller->next = &scope; // ... caller->next = NULL; }

Sin embargo, tendrá que saltar a través de algunos aros importantes si desea admitir continuaciones / saltos no locales. En ese caso, es más fácil asignar todo.

¿Cuáles son las técnicas de recolección de basura al compilar un lenguaje de recolección de basura en C? Sé de dos:

  1. mantener una pila sombra que guarda todas las raíces explícitamente en una estructura de datos

  2. Usa un recolector de basura conservador como el de Boehm.

La primera técnica es lenta, porque tienes que mantener la pila de sombras. Potencialmente, cada vez que se llama a una función, debe guardar las variables locales en una estructura de datos.

La segunda técnica también es lenta e inherentemente no recupera toda la basura debido a que utiliza un recolector de basura conservador.

Mi pregunta es: ¿cuál es el estado del arte de la recolección de basura cuando compilamos a C. Tenga en cuenta que no me refiero a una manera conveniente de hacer la recolección de basura al programar en C (este es el objetivo del recolector de basura de Boehm), solo una manera hacer recogida de basura al compilar a C.