C++ : La sémantique de déplacement

Utiliser l'idiome copy-swap

Testez gratuitement nos 1304 formations

pendant 10 jours !

Tester maintenant Afficher tous les abonnements
Pour mieux gérer la complexité de votre classe, optez pour l'idiome copy-swap. Cet idiome permet de fédérer les opérateurs d'affectation et ainsi, d'alléger les implémentations.

Transcription

Une classe qui implémente la sémantique de déplacement nous l'avons vu doit implémenter deux méthodes spécifiques : un constructeur de déplacement et un opérateur d'affectation de déplacement. Nous allons voir comment l'idiome "copy-swap" qui est en fait une méthode de programmation, une façon d'agencer les méthodes d'une classe, va nous permettre d'alléger cette implémentation. Alors pour ça et pour constater son effet sur la copie, nous allons pour l'instant commenter la partie déplacement de notre programme et nous focaliser donc sur la copie, et nous allons modifier notre opérateur d'affectation par copie qui lui maintenant ne va plus prendre une référence sur un objet mais prendre par valeurs l'objet à copier. Alors ceci permet une optimisation. Donc on va sur l'opérateur d'affectation, on met à jour son prototype en mettant donc un passage par valeurs. Cette optimisation concerne en fait la modification du paramètre passé. Je ne peux pas modifier le paramètre passé, je ne pouvais pas quand c'était une référence, je peux maintenant puisque c'est une valeur, une copie de l'original, donc quand je vais mettre 'b' dans 'd', ce que je fais plus bas dans le "main", ce qu'on a vu tout à l'heure ici. Quand je vais faire d = b donc je vais mettre 'b' dans 'd', 'b' sera copié dans 'autre' et donc si j'agis sur 'autre', je n'agis pas sur 'b' puisque c'est un passage par valeurs. Je peux donc me permettre d'utiliser la sémantique "move" pour optimiser cette affectation : au lieu de dupliquer un espace mémoire, je vais tout simplement permuter chacun des membres de l'instance de 'autre' avec les membres de mon instance, celle qui va recevoir le résultat de la copie. Donc je peux parler d'une affectation 'copy-swap' ou 'copy and swap'. Donc ici j'ai modifié mon opérateur d'affectation et donc lorsque j'exécute mon code ici, je vois une affectation "copy-swap" de 'tout le monde' ici, la destruction de l'ancienne valeur de 'd' 'd' valait 'Bonjour' mais il a reçu le contenu de 'tout le monde' et c'est mon objet temporaire 'autre' qui est là, qui a reçu 'Bonjour' par la permutation. Et lorsqu'il se détruit, il détruit 'Bonjour'. Donc j'ai le même effet mais en utilisant la sémantique de déplacement. Maintenant nous allons voir l'effet de la présence de ce nouvel opérateur sur le déplacement. Alors cet effet va être d'abord vu au niveau de la compilation, puisqu'ici, le compilateur signale qu'il y a une ambiguïté entre mes deux opérateurs, lequel choisir ? Il ne sait pas. il peut prendre l'un ou l'autre. Mais on va profiter justement de cette ambiguïté puisque on va pouvoir donc utiliser exclusivement notre idiome "copy-swap" et nous passer complètement de l'opérateur d'affectation par déplacement. Donc je peux supprimer ici. Alors pourquoi peut-il utiliser cet opérateur aussi pour un déplacement ? Quelque chose de beaucoup moins évident. Voilà je supprime. En fait, si on revient au "move", le "move" on l'a vu est une conversion en rvalue. Donc 'd', ici, ce qu'on essaye de lui affecter c'est une rvalue. Il faut donc un opérateur qui prenne une rvalue. Si on reprend notre opérateur "copy-swap", on n'a pas une rvalue en paramètre, on a un cadre. Donc il lui faut quelque chose qui permette de créer un paramètre à partir d'une rvalue. Ben c'est juste au-dessus qu'il va le trouver, avec le constructeur de déplacement. En effet, il va pouvoir créer un cadre ici, à partir d'un paramètre qui est 'autre' ici, qui est la rvalue qu'on a en résultat du "move". Donc 'b' va être passé en rvalue, passé à un constructeur de cadres, qui lui va être passé, ici, à l'opérateur d'affectation. On a donc bien un déplacement de 'b' dans 'd' mais ça se fait de façon indirecte puisque 'b' va être déplacé dans un paramètre par valeurs qui lui va être déplacé dans 'd'. Alors pour bien voir le fonctionnement, et ce fonctionnement là, on va commenter ici la copie puisqu'on ne verra pas le déplacement si 'b' et 'd' ont la même valeur, et puis on va pouvoir exécuter. Là vous voyez donc qu'on a l'appel au constructeur de déplacement pour pouvoir récupérer cette rvalue et après donc une affectation par "copy-swap" par notre opérateur qui a maintenant un paramètre par valeurs correct et la destruction de l'ancienne valeur de 'd' qui était 'Bonjour' et maintenant 'd' vaut 'tout le monde' et 'b' bien sûr a perdu sa valeur. J'ai pu donc grâce à l'idiome "copy-swap" implémenter à la fois une copie et un déplacement avec un seul opérateur comme nous le voyons ici. En plus de la simplicité d'implémentation puisque j'ai enlevé un opérateur à implémenter, l'idiome "copy-swap" a un autre avantage. Celui de garantir une meilleure gestion des problèmes des exceptions pendant le déplacement ou pendant la copie. Et c'est pour ça que je n'ai pas à spécifier le "noexcept". En effet si une exception intervient lors de la création de mon objet temporaire, aucune modification a été entamée lors du déplacement et donc je retombe dans un état après la gestion de l'exception qui est cohérent pour mon programme. Par sa simplicité et sa fiabilité, l'idiome "copy-swap" remplace donc efficacement les autres opérateurs d'affectation lorsque vous implémentez la sémantique de déplacement.

C++ : La sémantique de déplacement

Développez des classes compatibles avec la sémantique de déplacement en C++. Obtenez un code robuste et performant grâce à une utilisation pertinente de la sémantique move.

31 min (10 vidéos)
Aucun commentaire n´est disponible actuellement
 
Logiciel :
Spécial abonnés
Date de parution :24 oct. 2016

Votre formation est disponible en ligne avec option de téléchargement. Bonne nouvelle : vous ne devez pas choisir entre les deux. Dès que vous achetez une formation, vous disposez des deux options de consultation !

Le téléchargement vous permet de consulter la formation hors ligne et offre une interface plus conviviale. Si vous travaillez sur différents ordinateurs ou que vous ne voulez pas regarder la formation en une seule fois, connectez-vous sur cette page pour consulter en ligne les vidéos de la formation. Nous vous souhaitons un excellent apprentissage avec cette formation vidéo.

N'hésitez pas à nous contacter si vous avez des questions !