2015-01-08 6 views
8

Ostatnio uczę się nowych funkcji C++ 11. Jednak nie w pełni rozumiem jedną rzecz o wartościach r.Gdzie wartości r przechowywane są w C++?

Rozważmy następujący kod:

string getText() 
{ 
    return "Fabricati diem"; 
} 

string newText = getText(); 

Wezwanie do getText() tworzy wartość R, który jest kopiowany do newText zmiennej. Ale gdzie dokładnie jest przechowywana ta wartość? A co dzieje się z tym po skopiowaniu?

+1

W rzeczywistości nie jest kopiowany z powodu [optymalizacji wartości zwracanej] (http://en.wikipedia.org/wiki/Return_value_optimization) – CoryKramer

+7

@Cyber ​​Nie można go przenieść * i * RVOd. Jest jeden lub drugi, najprawdopodobniej ten drugi. – juanchopanza

+0

Dobry połów, masz rację. Zmieniłem mój komentarz. – CoryKramer

Odpowiedz

8

Wywołanie getText() tworzy wartość r, która jest kopiowana do zmiennej newText.

Może utworzyć tymczasowy; ale jest to jedna z sytuacji, w której dozwolone jest copy elision, więc jest bardziej prawdopodobne, że newText jest inicjowane bezpośrednio przez funkcję return, bez tymczasowego.

Ale gdzie dokładnie przechowywana jest ta wartość r?

Od kompilatora do przechowywania tymczasowego; standard określa tylko jego czas życia. Zazwyczaj będzie traktowany jak zmienna automatyczna, przechowywany w rejestrach lub w ramce stosu funkcji.

Co się z nim dzieje po skopiowaniu?

Czas życia elementu tymczasowego rozciąga się do końca wyrażenia pełnego, które je utworzyło (chyba że jest używane do inicjowania odniesienia, w takim przypadku trwa tak długo, jak ten odnośnik). Tak więc tutaj jest on niszczony natychmiast po użyciu, aby zainicjować newText.