C++ STL Chaîne Constructeur de Copie - Toujours une Copie en Profondeur?
J'ai vu plusieurs références contradictoires pour le constructeur de copie comportement de STL chaînes de caractères en C++ et j'espérais que quelqu'un pourrait clarifier la situation pour moi, vu le segment de code suivant:
string str() { return string("this is a string"); }
//meanwhile, in some other function...
string s = str();
Fait l'objet d'un " s " constituent une copie en profondeur de la chaîne de l'objet défini dans la fonction str()'? ou est l'objet d'un " s " simplement en pointant sur le même bloc de mémoire alloué au cours de la chaîne de l'appel du constructeur dans le 'str ()?
Il n'a pas d'importance ce que la copie exacte de la sémantique, parce que tout sane compilateur d'optimiser toutes les copies de suite dans l'exemple ci-dessus. Et si, pour une raison qui n'est pas possible, la sémantique de déplacement sont nécessaires à coup de pied dans.
OriginalL'auteur Gearoid Murphy | 2011-12-11
Vous devez vous connecter pour publier un commentaire.
Chaîne de copie en profondeur, ils n'ont pas partagé le même tampon.
Qui a déclaré lors du retour d'une fonction, la plupart des bons compilateurs pouvez soit utiliser la Valeur de Retour de l'Optimisation ou de la Copie élision de sorte que la manœuvre n'est pas si cher (voire gratuit).
Si vous êtes à l'aide de c++11, puis la sémantique de déplacement sont spécifiés par la norme afin de pour chose comme la chaîne de retour reste assuré que le pire des cas (même sans optimisations) est assez bon marché.
EDIT: pour résumer, vous avez la garantie que la chaîne "propre" aura une seule partie de la mémoire qui vont persister pendant au moins la durée de vie de la chaîne locale. Cependant, il est plus que probable que le compilateur ne pas copier à partir de la chaîne dans la fonction, mais plutôt un simple échange de pointeurs ou même ramené la copie complètement (le sens de la chaîne dans la fonction serait effectivement la chaîne que vous attribuez trop).
en.wikipedia.org/wiki/Copy_elision
Wikipedia :), je devrais avoir connu, comment puis-je savoir si ce mécanisme est utilisé dans g++?
Sans regarder l'ASM je ne pense pas que vous le pouvez. Mais comme je l'ai dit, la sémantique de déplacement sont une partie de la norme et constructeur de déplacement/assingment opérateur/doit être défini pour vous std-lib et ceux-ci seront utilisés si vous êtes à l'aide de c++11
Où est-ce que la garantie que chaque chaîne possède un unique tampon? La copie sur écriture implémentations pas permis?
OriginalL'auteur 111111
Oui, il effectue une logique copie en profondeur.
De N3126, 21.4.2, Tableau 61:
stackoverflow.com/questions/81656/...
Voir mise à jour de réponse.
OriginalL'auteur Oliver Charlesworth