Siento que me falta algo dolorosamente simple, pero estoy tratando de entender la recolección de basura según la implementación del Compilador Moderno de Andrew Appel en ML book y hay un pequeño párrafo dentro de la sección Mark and Sweep titulada Pointer Reversal (270).¿Qué le compra la inversión de puntero en la colección de basura de marcas y barridos?
En este punto creo que entiendo cómo funciona. En pocas palabras, a medida que recorre el gráfico, gira todos los punteros para que su predecesor esté dentro de su conjunto de campos. Luego, cuando haya terminado con un elemento dado, voltea los punteros hacia atrás para que apunten al lugar correcto nuevamente.
Si eso es correcto, ¿qué es exactamente lo que te compra? Appel intenta explicar esto, pero no entiendo completamente su fraseología.
Oh veo lo que quieres decir ahora. Por lo tanto, es una forma de obtener funcionalidad similar a la pila cuando no hay suficiente memoria disponible para asignar realmente una pila. Eso es bastante inteligente (como estas cosas siempre son). Pequeño problema, pero te refieres a durante la etapa de marcado ¿verdad? Barrer es lo que viene después? – yarian
@yarian Correcto, debería haber dicho marcando. – Heatsink
Es interesante observar que algunos esquemas de recolección de basura usan identificadores (punteros indirectos), pero .net usa punteros directos; cuando se reubica un objeto, cada referencia a ese objeto debe actualizarse para apuntar a la nueva dirección. Supongo que es por eso que se requiere que los objetos sean lo suficientemente grandes como para contener tres referencias de objetos, aunque solo hay dos referencias de objeto que vale la pena: cuando un objeto se reubica, los primeros 12/24 bytes de memoria que antes usaba el el objeto antiguo se puede usar como un bloc de notas para el proceso GC. Suena bien? – supercat