Déplacer le nom ou la Valeur de Retour d'Optimisation (NRVO)?
Permet de dire que nous avons le code suivant:
std::vector<int> f()
{
std::vector<int> y;
...
return y;
}
std::vector<int> x = ...
x = f();
Il semble que le compilateur a deux approches:
(a) NRVO: la Destruction des x, puis de construire f() à la place de x.
(b) se Déplacer: la Construction f() dans la temp de l'espace, déplacez f() dans x, détruire f().
Est le compilateur libre d'utiliser l'une ou l'autre approche, conformément à la norme?
- (a) n'est pas autorisé. Hormis le fait que l'opérateur d'affectation doit être appelé, il aurait le mauvais comportement lors d'une partie de la
...
dansf
déclenche une exception.x
ne doit pas être modifié dans ce cas, donc si ça a déjà été détruite, c'est un problème. - C'est un problème avec vague des questions. J'ai pensé qu'il ne voulait pas dire ce qu'il a littéralement écrit. Apparemment certaines personnes à d'autres pensaient de même.
Vous devez vous connecter pour publier un commentaire.
Le compilateur peut NRVO dans un temp de l'espace, ou de déplacer construire en un temp de l'espace. À partir de là, il va se déplacer attribuer
x
.Mise à jour:
Toutes les fois que vous êtes tenté d'optimisation avec des références rvalue, et vous n'êtes pas positif des résultats, créez vous-même un exemple de classe qui assure le suivi de son état:
Et exécuter cette classe par le biais de votre test. Par exemple:
Si cela peut aider, mettre imprimer des relevés dans les membres qui vous intéressent (par exemple, une copie constructeur, constructeur de déplacement, etc.).
Btw, si cette segmentation sur vous, ne vous inquiétez pas. Il segmentation pour moi aussi. Ainsi, cette conception particulière (de retour d'une rvalue référence à une variable locale) n'est pas une bonne conception. Sur votre système, au lieu de segfaulting, il peut imprimer "Une est détruite". Ce serait un signe de plus que vous ne voulez pas le faire.