Maison > développement back-end > C++ > Comment le retour d'un pointeur unique par valeur évite-t-il la construction de copies en C ?

Comment le retour d'un pointeur unique par valeur évite-t-il la construction de copies en C ?

Patricia Arquette
Libérer: 2024-12-12 17:34:12
original
989 Les gens l'ont consulté

How Does Returning a Unique Pointer by Value Avoid Copy Construction in C  ?

Retour par valeur dans les pointeurs uniques : comprendre l'exception

Problème :

Pointeurs uniques (std::unique_ptr) en C adhérer strictement à la sémantique de déplacement, interdisant la construction de copies. Cependant, il est possible de renvoyer un pointeur unique par valeur à partir d'une fonction et d'attribuer la valeur renvoyée sans appeler le constructeur de copie. Cette action soulève des questions sur la manière dont ce comportement apparemment paradoxal est autorisé.

Question :

Y a-t-il une clause spécifique dans la spécification du langage qui autorise cette exception ?

Réponse :

Oui. Comme indiqué dans les §34 et §35 du C 11, le compilateur est autorisé à effectuer une « élision de copie » dans certains scénarios. Voici l'extrait pertinent :

When certain criteria are met, an implementation is allowed to omit the copy/move construction of a class object [...]. This elision of copy/move operations, called copy elision, is permitted [...] in a return statement in a function with a class return type, when the expression is the name of a non-volatile automatic object with the same cv-unqualified type as the function return type [...].
Copier après la connexion

Essentiellement, cela signifie que si la valeur de retour est un objet automatique non volatile qui correspond au type de retour, le compilateur peut ignorer la construction de copie/déplacement.

De plus, selon la spécification :

When the criteria for elision of a copy operation are met and the object to be copied is designated by an lvalue, overload resolution to select the constructor for the copy is first performed as if the object were designated by an rvalue.
Copier après la connexion

Cela implique que lors du retour d'une lvalue (objet nommé) par déplacement, le compilateur tentera de résoudre la sélection du constructeur comme s'il s'agissait d'une valeur r (objet temporaire).

Détails d'implémentation :

Cette optimisation est implémentée via des techniques de compilateur. Dans les cas où l'élision de copie est autorisée, le compilateur crée directement l'objet renvoyé dans l'emplacement mémoire désigné sans subir de construction de copie. Cette approche garantit que l'objet renvoyé est unique et évite la création et la destruction inutiles d'objets.

Il est important de noter que ce comportement est spécifique à C 0x, et dans les versions précédentes de C , renvoyer un pointeur unique par valeur entraînent généralement un comportement indéfini ou des erreurs du compilateur.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal