Eventuali duplicati:
What happens if I return literal instead of declared std::string?comprensione C++ 11 rvalues, muovono la semantica e le prestazioni
Si consideri il seguente codice
1| string getName() {
2| return "meme";
3| }
4|
5| string name = getName();
La funzione getName() restituisce un oggetto temporaneo. In C++ 03, capisco che il costruttore di copia di "string" viene chiamato e l'oggetto temporaneo viene distrutto. In realtà sembra che il compilatore (almeno in gcc 4.7) ottimizzi la linea 5 non creando l'oggetto "nome" ma sostituendolo con l'oggetto temporaneo stesso e non distruggendo l'oggetto temporaneo (ho provato con una classe MyVector, non con std :: string).
Come definito negli standard C++ 11,
1. getName() restituisce un valore?
2. Nella riga 5 sopra, quale costruttore di stringa viene chiamato (sposta o copia)? Devo necessariamente chiamare std :: move() per chiamare il costruttore di movimento?
3. Con la semantica del movimento, è meno efficiente dell'ottimizzazione "copia elision" fornita dal compilatore?
Sarebbe _copy elision _... –
@ K-ballo grazie per avermi illuminato. –
L'aggiunta di numeri di linea è straordinaria! Mai visto prima =) – qwertz