Qu’est-ce que Rust a au lieu d’un ramasse-miettes?

Une question assez simple mais je ne suis pas familier avec Rust / C / C ++, etc.

Donc, dans cet exemple, je comprends que Rust récupère la mémoire allouée à «a» lorsqu’elle est hors de scope.

{ let a = 4 } 

Le problème que j’ai avec ça, c’est d’abord comment ça se passe, et deuxièmement, n’est-ce pas une sorte de ramassage des ordures? En quoi diffère-t-il du ramassage des ordures «typique»?

Excuses, je sais que c’est un peu élémentaire mais je viens de langues dynamics.

Le nettoyage de la mémoire est généralement utilisé périodiquement ou à la demande, comme si le tas était presque plein ou au-dessus d’un certain seuil. Il recherche ensuite les variables inutilisées et libère de la mémoire en fonction de l’ algorithme .

Rust saura quand la variable sort de la scope ou sa durée de vie se termine au moment de la compilation et insère donc les instructions LLVM / assembly correspondantes pour libérer la mémoire.

Rust permet également une certaine récupération de la mémoire, comme le comptage des références atomiques .

L’idée de base de la gestion des ressources (y compris la mémoire) dans un programme, quelle que soit la stratégie, est que les ressources liées à des «objects» inaccessibles peuvent être récupérées. Au-delà de la mémoire, ces ressources peuvent être des verrous mutex, des descripteurs de fichiers, des sockets, des connexions de firebase database …

Les langues avec un ramasse-miettes parsingnt périodiquement la mémoire (d’une manière ou d’une autre) pour trouver les objects inutilisés, libèrent les ressources qui leur sont associées et libèrent finalement la mémoire utilisée par ces objects.

Rust n’a pas de GC, comment ça se passe?

Rust a la propriété. En utilisant un système de type affine , il suit la variable qui retient toujours un object et, lorsque cette variable est hors de scope, appelle son destructeur. Vous pouvez facilement voir le système de type affine:

 fn main() { let s: Ssortingng = "Hello, World!".into(); let t = s; println!("{}", s); } 

Rendements:

 :4:24: 4:25 error: use of moved value: `s` [E0382] :4 println!("{}", s); :3:13: 3:14 note: `s` moved here because it has type `collections::ssortingng::Ssortingng`, which is moved by default :3 let t = s; ^ 

ce qui illustre parfaitement qu’à tout moment, au niveau linguistique, la propriété est suivie.

Cette propriété fonctionne de manière récursive: si vous avez un Vec (c’est-à-dire un tableau dynamic de chaînes), chaque Ssortingng appartient au Vec qui lui-même appartient à une variable ou à un autre object, etc. variable sort de son champ d’application, elle libère de manière récursive toutes les ressources qu’elle détenait, même indirectement. Dans le cas du Vec cela signifie:

  1. Libération de la mémoire tampon associée à chaque Ssortingng
  2. Libération de la mémoire tampon associée à la Vec elle-même

Ainsi, grâce au suivi de propriété, la durée de vie de TOUS les objects du programme est ssortingctement liée à une (ou plusieurs) variable de fonction, qui finira par sortir de son champ d’application (à la fin du bloc auquel elle appartient).

Note: ceci est un peu optimiste, en utilisant le comptage de références ( Rc ou Arc ), il est possible de former des cycles de références et donc de provoquer des memory leaks, auquel cas les ressources liées au cycle peuvent ne jamais être libérées.

Avec un langage où vous devez gérer manuellement la mémoire, la distinction entre la stack et le tas devient critique. Chaque fois que vous appelez une fonction, un espace suffisant est alloué sur la stack pour toutes les variables contenues dans la scope de cette fonction. Lorsque la fonction retourne, le cadre de stack associé à cette fonction est “sorti” de la stack et la mémoire est libérée pour une utilisation ultérieure.

D’un sharepoint vue pratique, ce nettoyage de mémoire involontaire est utilisé comme un moyen de stockage automatique de la mémoire qui sera effacé à la fin du champ d’application de la fonction.

Il y a plus d’informations disponibles ici: https://doc.rust-lang.org/book/the-stack-and-the-heap.html