Le problème de la gestion de la mémoire

La gestion manuelle de la mémoire, à savoir la nécessité de libérer manuellement la mémoire lorsqu'on n'en a plus besoin, a des conséquences catastrophiques sur la modularité d'un programme. Pour un objet, le fait d'être vivant (référencé au moins une fois) est une qualité globale qui traverse donc les barrières d'abstractions des modules. Il y a plusieurs solutions à ce problème dans des langages sans gestion automatique de la mémoire (comme C et C++).

Une première possibilité est de copier les objets. De cette manière, chaque module a sa copie et peut donc libérer la mémoire associée quand il le souhaite. Mais copier un objet influence la sémantique du programme. La mise à jour d'un objet nécessite maintenant l'accès à toutes ses copies. De plus, l'existence de plusieurs copies d'un objet nécessite beaucoup plus de mémoire disponible et beaucoup plus de temps de calcul pour la traiter.

Une deuxième possibilité est d'implémenter (souvent manuellement) un système de compteurs de références. C'est surtout une solution pratique en C++ qui offre la possibilité de redéfinir des opérations comme l'affectation. À chaque affectation de type x = y, le compteur de références de l'objet valeur de x est décrémenté et celui de l'objet valeur de y est incrémenté. Un objet dont le compteur est à zéro est récupérable, car il n'est référencé par aucun autre objet. Les systèmes à compteurs de références posent plusieurs problèmes, le plus sérieux étant qu'ils sont incapables de récupérer des cycles d'objets. Un autre problème vient du fait que la performance d'un programme avec compteurs de références est sérieusement diminuée ; c'est d'autant plus grave que le souci de performance est souvent la principale raison d'avoir choisi au départ un langage avec une gestion manuelle de la mémoire. En fait, la manipulation d'un compteur de références (surtout la décrémentation) nécessite plusieurs opérations, parfois coûteuses. La simple affectation d'un pointeur, opération d'environ un cycle d'horloge, est alors transformée en une opération compliquée pouvant prendre 10 fois plus de temps. Un autre problème important lié à cette solution est aussi que le code pour la manipulation des compteurs, en particulier celui de la redéfinition de certaines opérations comme l'affectation, doit être maintenu au même titre que l'application proprement dite.

Irene DURAND
2011-10-14