2016-06-02 1 views
0

temporaire Considérez ce qui suit:const référence se liant à un

string const& name1 = get_name(...); 
string const name2 = get_name(...); 

get_name retourne un objet string. Comme on le sait, avec l'introduction de la sémantique des déplacements dans C++ 11, les deux instructions peuvent être efficaces, la première étant légèrement plus précise, car il n'est pas nécessaire d'effectuer un déplacement. (Oui, je sais que sur l'optimisation de la valeur de retour, mais il en est ainsi, il est un peu plus nuancé l'idée générale..)

Cependant, les appels de fonction suppose qu'ils sont laissés sur ceci:

string const& name3 {"Billy"}; 
string const name4 {"Debbie"}; 

Dans ce cas, , le littéral littéral "Billy" est implicitement converti en un string temporaire et name3 se lie au temporaire. Évidemment, name4 n'est pas temporaire.

Est-il vrai que pour name3 et name4, les deux sont tout aussi efficaces? me semble que ce serait ...

+0

Vous semble que ce serait ... quoi? Pour 'name3', un' chaîne' temporaire sera construit à partir du littéral '' Billy'' et ensuite lié à 'name3', pour' name4', il (ie 'string') sera construit à partir du' 'Debbie littéral' ' "' directement. – songyuanyao

+3

Je dirais que vous allez dans les zones d'optimisation prématurée ici et devrait choisir celui qui est plus clair (à mon avis, la non-référence), sauf si vous avez effectivement mesuré cela comme un goulot d'étranglement. –

+3

Je m'attendrais au même code généré (même dans le niveau d'optimisation inférieur). – Jarod42

Répondre

1

name3 et name4 sont impossibles à distinguer par le reste du programme, sauf si vous utilisez spécifiquement decltype(name3) ou decltype(name4). Ainsi, le compilateur peut générer le même assemblage pour les deux cas.

Bien sûr, ceci est une déclaration générale; n'importe quel compilateur individuel peut générer du code plus lent ou plus rapide et la seule façon de le savoir est de l'essayer sur ce compilateur.

+0

Probablement signifier 'decltype ((nom3))' etc, mais je comprends votre point. – KyleKnoepfel

+0

@KyleKnoepfel Je ne voulais pas dire ça. 'decltype ((nom3))' est le même que 'decltype ((nom4))' cependant 'decltype (nom3)' diffère de 'decltype (nom4)'. –

+0

@MM Ah ... j'ai fait une gaffe. Merci pour la correction. – KyleKnoepfel