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
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.
S'initier à la programmation by Claude Delannoy(434)
Programmez avec le langage C++ by Mathieu NEBRA & Matthieu SCHALLER(408)
Android Application Development All-in-One For Dummies by Barry Burd & John Paul Mueller(391)
Concevez votre site web avec PHP et MySQL by Mathieu & Nebra(349)
Programmer efficacement en C++ by Meyers Scott(329)
Dynamisez vos sites web avec Javascript ! by Sébastien DE LA MARCK & Johann PARDANAUD(287)
Frontier Computing by Jason C. Hung Neil Y. Yen & Lin Hui(270)
Algorithmique et programmation en Java by Vincent Granet(265)
Des applications ultra-rapides avec Node.js by Mathieu & Nebra(248)
Machine Learning Design Patterns by Valliappa Lakshmanan & Sara Robinson & Michael Munn(238)
Professional Android 4 Application Development by Meier Reto(221)
Machine Learning Design Patterns by Valliappa Lakshmanan(207)
Python Machine Learning By Example by Yuxi (Hayden) Liu(185)