Programmer efficacement en C++ by Meyers Scott

Programmer efficacement en C++ by Meyers Scott

Auteur:Meyers Scott
La langue: fra
Format: epub
Éditeur: Dunod
Publié: 2016-02-21T16:00:00+00:00


private:

struct Impl;

std::shared_ptr<Impl> pImpl; // std::shared_ptr à la place

}; // de std::unique_ptr.

et le code client suivant qui inclut widget.h :

Widget w1;

auto w2(std::move(w1)); // Construire w2 par déplacement.

w1 = std::move(w2); // Affecter w1 par déplacement.

la compilation et l’exécution se passent comme nous le souhaitons : w1 est construit par défaut, sa valeur est déplacée dans w2, elle est ensuite redéplacée dans w1, et, pour finir, w1 et w2 sont détruits (provoquant la destruction de l’objet Widget::Impl pointé).

L’origine de la différence de comportement liée à l’emploi de std::unique_ptr ou de std::shared_ptr pour pImpl vient de la prise en charge des supprimeurs personnalisés par chacun de ces pointeurs intelligents. Pour std::unique_ptr, le type du supprimeur fait partie du type du pointeur intelligent et le compilateur peut ainsi générer des structures de données plus petites et un code d’exécution plus rapide. En raison de cette efficacité accrue, les types pointés doivent être complets si des fonctions spéciales générées par le compilateur (par exemple des destructeurs ou des opérations de déplacement) sont employées. Pour std::shared_ptr, le type du supprimeur ne fait pas partie du type du pointeur intelligent. Cela impose des structures de données d’exécution plus volumineuses et du code un tantinet plus lent. En revanche, les types pointés n’ont pas besoin d’être complets pour utiliser les fonctions spéciales générées par le compilateur.

Dans le contexte de l’idiome Pimpl, les caractéristiques de std::unique_ptr et de std::shared_ptr n’exigent pas véritablement des concessions, car la relation entre des classes comme Widget et des classes comme Widget::Impl consiste en une propriété exclusive et std::unique_ptr est donc l’outil adapté. Néanmoins, il est bon de savoir que dans d’autres situations, lorsqu’une propriété partagée existe (et où std::shared_ptr est donc le choix de conception approprié), la définition des fonctions imposée par l’utilisation de std::unique_ptr n’est plus requise.

À retenir

L’idiome Pimpl diminue les temps de construction en réduisant les dépendances de compilation entre les clients des classes et les implémentations de ces classes.

Pour les pointeurs pImpl de type std::unique_ptr, il faut déclarer les fonctions membres spéciales dans l’en-tête de la classe, mais les mettre en œuvre dans le fichier d’implémentation. Il faut procéder ainsi même lorsque les implémentations par défaut des fonctions conviennent.

Le conseil précédent s’applique à std::unique_ptr, non à std::shared_ptr.



Télécharger



Déni de responsabilité:
Ce site ne stocke aucun fichier sur son serveur. Nous ne faisons qu'indexer et lier au contenu fourni par d'autres sites. Veuillez contacter les fournisseurs de contenu pour supprimer le contenu des droits d'auteur, le cas échéant, et nous envoyer un courrier électronique. Nous supprimerons immédiatement les liens ou contenus pertinents.