La norme C++23 supprime la prise en charge du Garbage Collection, par Sandor Dargo, d�veloppeur C++

Si nous parcourons la liste des caract�ristiques de C++23, nous pouvons tomber sur la notion de garbage collection � deux reprises. Une fois parmi les caract�ristiques du langage et une fois parmi les caract�ristiques de la biblioth�que. Les deux entr�es font r�f�rence au m�me document (P2186R2) : le support du garbage collection (GC en abr�g�) est en train d'�tre retir� du C++. Pour �tre clair, il n'est pas d�pr�ci�, mais compl�tement supprim�. Comme il s'agit d'une fonctionnalit� non impl�ment�e et non support�e, sa suppression est une belle op�ration de nettoyage du langage. Il ne serait pas non plus surprenant que vous n'ayez jamais entendu parler de GC en C++.

La premi�re surprise que vous r�serve cet article est le fait qu'il parle du Garbage Collection et du C++. Lorsque j'ai appris � conna�tre le C++ par rapport � Java, il y a bien longtemps, l'un des avantages du C++ �tait la gestion d�terministe de la m�moire gr�ce � l'absence du garbage collection.

Il s'av�re qu'en 2008, un support minimal pour le garbage collection et la d�tection de fuites bas�e sur l'accessibilit� a �t� ajout� au C++0x. Cet article est bas� sur deux articles ant�rieurs, dont vous trouverez la r�f�rence dans l'article cit� pr�c�demment. Les garbage collectors standard doivent prendre en compte la s�curit� stricte des pointeurs. En fait, il n'existe pas de tels ramasse-miettes dans les principales biblioth�ques standard.

N2670 a introduit l'�num�ration std::pointer_safety avec trois �num�rateurs : relaxed, preferred, strict. Lorsque std::get_pointer_safety() est appel�e, une impl�mentation renvoie une valeur indiquant comment elle traite les pointeurs qui ne sont pas d�riv�s en toute s�curit� (voir ci-dessous).

  • pointer_safety::relaxed est renvoy� si les pointeurs non d�riv�s en toute s�curit� seront trait�s de la m�me mani�re que les pointeurs d�riv�s en toute s�curit� pendant toute la dur�e du programme.
  • pointer_safety::preferred est renvoy� si les pointeurs non d�riv�s en toute s�curit� seront trait�s de la m�me mani�re que les pointeurs d�riv�s en toute s�curit�, mais en m�me temps, l'impl�mentation est autoris�e � indiquer qu'il est souhaitable d'�viter de d�r�f�rencer ces pointeurs.
  • pointer_safety::strict est renvoy� si les pointeurs non d�riv�s en toute s�curit� peuvent �tre trait�s diff�remment des pointeurs d�riv�s en toute s�curit�.

La valeur d'un pointeur est un pointeur d�riv� en toute s�curit� vers un objet dynamique uniquement s'il est de type pointeur vers objet et s'il l'est :

  • la valeur renvoy�e par un appel � l'impl�mentation de ::operator new(std::size_t) de la biblioth�que standard C++ ; le r�sultat de l'adresse d'un sous-objet d'une valeur r�sultant du d�r�f�rencement d'une valeur de pointeur d�riv�e en toute s�curit� ;
  • le r�sultat d'une arithm�tique de pointeurs bien d�finie utilisant une valeur de pointeur d�riv�e en toute s�curit� ;
  • le r�sultat d'une conversion de pointeur bien d�fini d'une valeur de pointeur d�riv�e en toute s�curit� ;
  • le r�sultat d'une reinterpret_cast d'une valeur de pointeur d�riv�e en toute s�curit� ;
  • le r�sultat d'une reinterpret_cast d'une repr�sentation enti�re d'une valeur de pointeur d�riv�e en toute s�curit� ;
  • la valeur d'un objet dont la valeur a �t� copi�e � partir d'un objet pointeur tra�able, lorsque, au moment de la copie, l'objet source contenait une copie d'une valeur de pointeur d�riv�e en toute s�curit�.
Le standard permet aux impl�mentations de s'en tirer avec n'importe quelle impl�mentation de GC, m�me avec des impl�mentations no-op, et cela n'a donc pas beaucoup de sens de les inclure dans le standard. Cela ne signifie pas pour autant qu'il n'y a pas eu de garbage collectors r�ussis pour le C++. Le cas d'utilisation le plus fr�quent pour le GC impl�ment� en C++ est d'avoir des machines virtuelles �crites en C++ pour d'autres langages qui sont garbage collect�s. Diff�rentes VM JavaScript sont de ce type, ainsi que Lua.

Mais ces garbage collectors ont aussi leurs propres exigences qui sont influenc�es bien plus par le langage qu'ils utilisent comme runtime que par le standard C++.

Bien que la norme P2186R2 �num�re davantage de probl�mes, je pense qu'il est important de mettre l'accent sur deux d'entre eux.

Lorsque vous avez lu ce qui pr�c�de � propos de std::pointer_safety, avez-vous compris la diff�rence entre relaxed et preferred ? Si c'est le cas, veuillez nous l'expliquer. Il n'est pas du tout clair sur ce que doivent faire les programmes bien g�r�s lorsqu'ils re�oivent cette information. Cela ne fait qu'apporter de la confusion sans aucun avantage.

L'autre probl�me est la d�finition des pointeurs d�riv�s en toute s�curit�. Pour obtenir un pointeur d�riv� en toute s�curit�, vous devez utiliser l'op�rateur global ::operator new et il n'y a pas d'autres moyens d�finis par l'impl�mentation pour obtenir de tels pointeurs. C'est un probl�me parce que les gens veulent souvent utiliser d'autres news ou �viter compl�tement leur utilisation pour cr�er des objets dans des tableaux locaux tout en �vitant l'utilisation du heap.

En cons�quence, le garbage collection a �t� supprim� du C++23 dans sa grande majorit�, de m�me que la s�curit� des pointeurs. Les noms suivants ont aussi �t� supprim�s de std:: :

  • declare_reachable
  • undeclare_reachable
  • declare_no_pointers
  • undeclare_no_pointers
  • get_pointer_safety
  • pointer_safety

Conclusion

Le Garbage Collection et les fonctionnalit�s associ�es ont �t� retir�s du C++23. Si vous �tes surpris d'apprendre que le standard C++ avait un support pour le GC, vous n'�tes pas le seul. Il n'a pas �t� impl�ment�, il �tait confus et plut�t inutile, c'est pourquoi il a �t� supprim�. Bien qu'il existe des garbage collectors, principalement pour les VM �crites en C++ en tant que runtime pour d'autres langages, ils ne sont pas affect�s car ils ne s'appuyaient pas sur le standard, exactement pour les raisons qui ont conduit � sa suppression.

Un peu de simplification de la norme ne fait jamais de mal.

Source : "C++23: Removing garbage collection support" par Sandor Dargo, d�veloppeur C++

Et vous ?

Quel est votre avis sur le sujet ?

Voir aussi

Les travaux sur la norme C++ 23 sont termin�s et cette nouvelle version porte le nom de code "Pandemic Edition", C++ 23 cherche � am�liorer la vitesse de compilation et l'hygi�ne du code

Le comit� ISO C++ a propos� une feuille de route pour C++ 23 et finalis� la nouvelle version du langage C++ 20, la norme devrait �tre publi�e dans les mois � venir