Există ceva în neregulă cu revenirea valorilor implicite construite?

Să presupunem că am următorul cod:

class some_class{};

some_class some_function()
{
    return some_class();
}

Acest lucru pare să funcționeze destul de bine și mă salvează de dificultatea de a declara o variabilă doar pentru a obține o valoare de returnare. Dar nu cred că am văzut acest lucru în orice fel de tutorial sau referință. Este un lucru specific compilatorului (Visual C ++)? Sau face acest lucru ceva greșit?

0

6 răspunsuri

Este valabil, dar performanța poate să nu fie ideală în funcție de modul în care se numește.

De exemplu:

A a;
a = fn();

și

A a = fn();

nu sunt la fel.

In the first case the default constructor is called, șithen the assignment operator is invoked on a which requires a temporary variable to be constructed.

În cel de-al doilea caz, constructorul de copiere este utilizat.

An intelligent enough compiler will work out what optimizations are possible. But, if the copy constructor is user supplied then I don't see how the compiler can optimize out the temporary variable. It has to invoke the copy constructor, șito do that it has to have another instance.

0
adăugat
Standardul permite în mod explicit compilatorului să elideze constructorul de copiere.
adăugat autor Daniel James, sursa

Nu este perfect valabil. Acest lucru va fi, de asemenea, mai eficient, deoarece compilatorul este de fapt capabil să optimizeze temporar.

0
adăugat
De fapt, compilatoarele moderne sunt adesea capabile să opimizeze o variabilă numită care se întoarce
adăugat autor Nemanja Trifunovic, sursa

Acesta este perfect legal C ++ și orice compilator ar trebui să o accepte. Ce te face să crezi că ar putea face ceva greșit?

0
adăugat
Doar că n-am văzut-o niciodată într-o experiență limitată cu C ++.
adăugat autor Jason Baker, sursa
Destul de corect. Folosește-o cu siguranță, dacă nu există nici un motiv să folosești o variabilă temporară atunci nu trebuie!
adăugat autor Greg Hewgill, sursa

Diferența dintre exemplul lui Rob Walker se numește Return Value Optimization (RVO) dacă doriți să îl utilizați pentru Google.

De altfel, dacă doriți să vă asigurați că obiectul dvs. este returnat în modul cel mai eficient, creați obiectul pe heap (adică prin intermediul unui nou) utilizând un partajat_ptr și returnați în schimb un share_ptr. Indicatorul este returnat și numărul de referință este corect.

0
adăugat
În general vorbind, RVO este mai eficientă decât utilizarea partajată_ptr, obiectul este creat în loc de pe heap. De asemenea, shared_ptr trebuie să creeze un obiect suplimentar pentru a stoca count-ul.
adăugat autor Daniel James, sursa

Acest lucru este perfect rezonabil C ++.

0
adăugat

Întoarcerea obiectelor dintr-un apel de funcții este modelul "Factory" Design Pattern și este folosit pe scară largă.

Cu toate acestea, veți dori să fiți atenți dacă veți întoarce obiecte sau pointeri la obiecte. Prima dintre acestea vă va face să copiați constructorii/operatorii de atribuire, ceea ce poate fi o durere.

0
adăugat