2011-01-11 19 views
12

¿Cuáles son las diferencias entre los punteros compartidos (como boost :: shared_ptr o el nuevo std :: shared_ptr) y los métodos de recolección de basura (como los implementados en Java o C#)? Tal como lo entiendo, los punteros compartidos hacen un seguimiento de cuántas veces las variables apuntan al recurso y automáticamente destruyen el recurso cuando el recuento llega a cero. Sin embargo, tengo entendido que el recolector de basura también administra los recursos de la memoria, pero requiere recursos adicionales para determinar si todavía se está haciendo referencia a un objeto y no necesariamente destruye el recurso de inmediato.Recolección de basura vs. punteros compartidos

¿Estoy en lo correcto en cuanto a mis suposiciones y existen otras diferencias entre el uso de recolectores de basura y punteros compartidos? Además, ¿por qué alguien utilizaría un recolector de basura sobre un puntero compartido si realizan tareas similares pero con distintas cifras de rendimiento?

+1

El uso de punteros compartidos ** es ** una técnica de recolección de basura. Muchos recolectores de basura implementan, al menos como primer paso, el recuento de referencias. –

Respuesta

12

La diferencia principal radica, como ha notado, en cuando se libera/destruye el recurso.

Una ventaja de que un GC puede ser útil es si tiene recursos que tardan mucho tiempo en liberarse. Para una vida útil corta del programa, puede ser bueno dejar los recursos colgando y limpiarlos al final. Si se alcanzan los límites de recursos, el GC puede actuar para liberar algunos de ellos. Los punteros compartidos, por otro lado, liberan sus recursos tan pronto como el recuento de referencia llega a cero. Esto podría ser costoso para los frecuentes ciclos de adquisición-liberación de un recurso con costosos requisitos de tiempo.

Por otro lado, en algunas implementaciones de recolección de elementos no utilizados, la recolección de elementos no utilizados requiere que todo el programa pause su ejecución mientras se examina, mueve y libera la memoria. Hay implementaciones más inteligentes, pero ninguna es perfecta.

+4

Existen colectores de basura sin pausa, incrementales y concurrentes que no requieren interrupción del mutador por parte del colector. Además, como muestra la literatura, los recolectores de basura generalmente tienen un mejor rendimiento que el recuento de referencia en el mutador típico. –

15

Esos punteros compartidos (generalmente llamados recuento de referencias) corren el riesgo de ciclos.

La recolección de elementos no utilizados (Marcar y Barrido) no tiene este problema.

+0

¿podría explicar qué quiere decir con "riesgo de ciclos"? ¿Quiere decir tener el recuento de referencia "ajustado" debido al tipo de datos utilizado para mantener el recuento de referencias? ¿O algo mas? – helloworld922

+3

Solo imagina A sosteniendo un ptr a B y B apuntando a A. –

+0

Ah, ya veo. Gracias.Demasiado mal desbordamiento de pila no te deja marcar múltiples buenas respuestas :(Creo que ambas son excelentes respuestas – helloworld922

0

En un sistema simple recolectado de basura, nadie mantendrá un puntero directo a ningún objeto; en su lugar, el código mantendrá referencias a las entradas de la tabla que apuntan a los objetos en el montón. Cada objeto en el montón almacenará su tamaño (lo que significa que todos los objetos del montón formarán una lista de enlace único) y una referencia retrospectiva al objeto en la tabla de objetos que lo contiene (o al menos está acostumbrado).

Cuando el montón o la tabla de objetos se llena, el sistema establecerá un indicador de "eliminarme" en cada objeto de la tabla. Examinará todos los objetos que conozca y, si se configuró su "indicador de eliminación", lo desarmará y agregará todos los objetos que conoce a la lista de objetos que se examinarán. Una vez hecho esto, se puede eliminar cualquier objeto cuya bandera "eliminarme" aún esté establecida.

Una vez hecho esto, el sistema comenzará al principio del montón, tomará cada objeto almacenado allí y verá si la referencia de su objeto aún apunta a él. Si es así, copiará ese objeto al principio del montón, o justo después del final del último objeto copiado; de lo contrario, el objeto se omitirá (y es probable que se sobrescriba cuando se copian otros objetos).

Cuestiones relacionadas