Powiel możliwe:
What happens if I return literal instead of declared std::string?zrozumienie C++ 11 rvalues, przenieść semantykę i wydajność
Rozważmy następujący kod
1| string getName() {
2| return "meme";
3| }
4|
5| string name = getName();
getName() funkcja zwraca obiekt tymczasowy. W języku C++ 03 rozumiem, że konstruktor kopii "string" zostaje wywołany, a obiekt tymczasowy zostaje zniszczony. W rzeczywistości wydaje się, że kompilator (co najmniej w gcc 4.7) optymalizuje wiersz 5, nie tworząc obiektu "nazwa", lecz zastępując go samym obiektem tymczasowym i nie niszcząc obiektu tymczasowego (próbowałem z klasą MyVector, a nie std :: string).
Jak zdefiniowano w standardach C++ 11,
1. Czy funkcja getName() zwraca wartość r?
2. W linii 5 powyżej, który konstruktor ciągu zostanie wywołany (przenieść lub skopiować)? Czy powinienem koniecznie wywołać std :: move(), aby konstruktor ruchu został wywołany?
3. Czy z semantyką ruchu jest ona mniej wydajna niż optymalizacja "kopiowania" dostarczona przez kompilator?
To byłaby _copy elision _... –
@ K-ballo dzięki za oświecenie mnie. –
Dodawanie numerów linii wygląda niesamowicie! Nigdy wcześniej tego nie widziałem =) – qwertz