Algumas vantagens da contagem de referência sobre a coleta de lixo:
-
Baixa sobrecarga. Coletores de lixo podem ser bastante intrusivos (por exemplo, fazendo seu programa congelar em momentos imprevisíveis enquanto um ciclo de coleta de lixo processa) e bastante intensivo de memória (por exemplo, a memória do processo aumenta desnecessariamente em muitos megabytes antes que a coleta de lixo seja ativada)
-
Comportamento mais previsível. Com a contagem de referência, você tem a garantia de que seu objeto será liberado no instante em que a última referência a ele desaparecer. Com a coleta de lixo, por outro lado, seu objeto será liberado "em algum momento", quando o sistema se aproximar dele. Para a RAM, isso geralmente não é um grande problema em desktops ou servidores pouco carregados, mas para outros recursos (por exemplo, identificadores de arquivo), é necessário que eles sejam fechados o mais rápido possível para evitar possíveis conflitos mais tarde.
-
Mais simples. A contagem de referência pode ser explicada em poucos minutos e implementada em uma ou duas horas. Coletores de lixo, especialmente aqueles com desempenho decente, são extremamente complexos e muitas pessoas não os entendem.
-
Padrão. O C ++ inclui contagem de referência (via shared_ptr) e amigos no STL, o que significa que a maioria dos programadores de C ++ está familiarizada com ele e a maioria dos códigos C ++ funcionarão com ele. No entanto, não existe coletor de lixo C ++ padrão, o que significa que você deve escolher um e esperar que ele funcione bem para o seu caso de uso - e se isso não acontecer, é problema seu corrigir, não o idioma.
Quanto às desvantagens alegadas da contagem de referência - não detectar ciclos é um problema, mas um que eu nunca encontrei pessoalmente nos últimos dez anos usando contagem de referência. A maioria das estruturas de dados é naturalmente acíclica, e se você se deparar com uma situação em que você precisa de referências cíclicas (por exemplo, ponteiro pai em um nó de árvore), basta usar um weak_ptr ou um ponteiro C bruto para "direção inversa". Contanto que você esteja ciente do possível problema quando estiver projetando suas estruturas de dados, não é um problema.
Quanto ao desempenho, nunca tive um problema com o desempenho da contagem de referência. Eu tive problemas com o desempenho da coleta de lixo, em particular os congelamentos aleatórios que o CG pode incorrer, aos quais a única solução ("não alocar objetos") poderia também ser reformulada como "não use o GC" .