23 Mai 2016

Le principe de Boxing / Unboxing dans les langages objets

En .NET comme en Java, il est possible de passer un entier (type valeur) dans une méthode qui prend en paramètre le type object.

Voici un exemple en C# (Age est une propriété de type int) :

 

Comment cela est-il possible ? int n’hérite pas de object sinon ce serait un type objet et non valeur !

Si cela fonctionne c’est grâce au principe du boxing !

Au moment de l’exécution Age est un entier dans la pile, et se retrouve cloné en type objet dans le tas.

 

Petit rappel la pile et le tas sont 2 zones mémoires :

                La pile est plus rapide que le tas

                Le tas est plus flexible que la pile

 

Évidemment c’est transparent pour le développeur, mais pour les nano-curieux sachez que c’est nano-couteux !

Le CLR va réaliser une opération new pour allouer ce nouvel objet dans le tas !

 

Pour l’unboxing c’est le procédé inverse, on a un entier dans un objet et on le cast pour le faire ressortir :

 

L’article MS faisant référence à ce procédé : https://msdn.microsoft.com/en-us/library/yz2be5wk.aspx?f=255&MSPPError=-2147217396

In relation to simple assignments, boxing and unboxing are computationally expensive processes.

 

En conclusion, pour éviter ce comportement, prévoyez une surcharge de la méthode avec le type int en paramètre, cela soulagera le CPU le temps d’un nano-café !

Share