Há um entendimento equivocado sobre esse assunto que se espalhou na comunidade Rust.
O mecanismo de propriedade não tem nada a ver com coletor de lixo. Ele não elimina o coletor de lixo, ele apenas garante que a referência não será perdida sem precisa de controles complexos (se bem que muita gente considera o sistema de borrow complexo).
Outro erro é as pessoas acharem que coletor de lixo é só se tiver um mecanismo de tracing, como é em praticamente todas as linguagens de script, Java, C#, etc. Mesmo um controle de referência é um coletor de lixo. A coleta de lixo é quando a memória no heap é coletada automaticamente, não importa o mecanismo.
E adivinha? O String
de Rust faz a coleta automaticamente para você. Então você não precisa de um coletor de lixo porque já tem dentro deste objeto.
A única coisa que o mecanismo apresentado faz, é garantir que não tenha mais de um dono do objeto, assim ele sabe que no momento que aquele objeto sair de escopo é necessário chamar um destrutor de String
, o compilador coloca para você e faz a coleta do que agora é lixo.
Sem esse mecanismo você pode ter mais de um objeto sendo dono e em situações mais complexas (não essa do exemplo acima) ele não saber disso e achar que porque um dono não terá mais a posse do objeto já pode remover o objeto do heap, mas ainda tem outro dono. Isso pode acontecer em C ou C++. Mas estão criando mecanismos para controlar isso.
Mas e se quiser ser mais eficiente e alocar na pilha? C e C++ isso é trivial e precisa tomar alguns cuidados. Por isso em aplicações reais Rust não consegue ser mais rápido que C ou C++, embora em testes sintéticos é fácil demonstrar que são iguais.
Rust não pode alocar String
na pilha? Que eu saiba não, pode ter outros mecanismos que faça isso, pode ser que dê com o uso de contexto unsafe
que perde o controle de propriedade. Eu não me aprofundei nisso, mas se alocado na pilha desalocar já é automático mesmo.
Também é necessário dizer que este exemplo provavelmente não funciona assim. Porque ele tem apenas uma referência para um texto estático, ou seja, ele estará no executável, portanto, ele será alocado na memória em uma região que não pode ser mexida, não é nem a pilha, nem o heap. Então eu acredito que String
tem uma otimização para a referência interna para o texto seja apontado diretamente para essa área estática e que nunca é desalocada, aí não tem uma coleta de lixo, mas só porque teve uma otimização em tempo de compilação, algo que boa parte das linguagens já fazem também.
IAs não sabem o que dizem, elas apenas repetem o que foi muito repetido pela internet. Ela pode estar dizendo a verdade, mas não toda a verdade. E a fonte colocada não tem nada para constatar o que foi dito. Isso é o mesmo que escrever "Fonte: a internet". ou "Fonte: a biblioteca".
Para entender mais comece por aqui: https://pt.stackoverflow.com/q/498527/101 (siga os links).
Depois vá em: https://pt.stackoverflow.com/q/252163/101 e https://pt.stackoverflow.com/q/280973/101 e termine vendo os links de https://pt.stackoverflow.com/q/342463/101.
S2
Farei algo que muitos pedem para aprender a programar corretamente, gratuitamente (não vendo nada, é retribuição na minha aposentadoria) (links aqui no perfil também).