2013-01-20 9 views
6

Powiedzmy mam funkcjęCzy kompilator C++ może wykonać RVO dla wartości zwracanej przez const?

#include <string> 

std::string const foo() 
{ 
    std::string s = "bar"; 
    return s; 
} 

int main() 
{ 
    std::string t = foo(); 
} 

Czy kompilator wykonać (nazwa) return wartość optymalizacja dla t, choć typy s i t są zarówno różne od typu zwracanej foo powodu const Różnica w różnicy?

(Jeśli odpowiedź jest inna dla C++ 03 i C++ 11 to jestem zdecydowanie zainteresowany poznaniem C++ 03 odpowiedzi).

+0

Dlaczego nie uwzględnisz wyników eksperymentów z co najmniej jednym kompilatorem? –

+0

@MarcGlisse: Cóż, Visual C++ 2008 ją zoptymalizował, ale nie jestem pewien, czy standard rzeczywiście pozwala na to, czy nie. – Mehrdad

Odpowiedz

7

Nie ma sposobu na optymalizację RVO złamać obietnica const, więc nie ma problemu: można wykonać RVO.


Jednak ruch semantyka wpływa const. Skutecznie wyłącza semantykę przenoszenia, czyli wywołania konstruktora T(T&&) lub operatora przypisania przeniesienia. Więc na ogół nie używaj const dla zwracanej wartości.

Scott Meyers pierwotnie polecił const dla zwracanych wartości, dla bardziej rozsądnego kodowania.

Następnie Andrei Alexandrescu, w swoim artykule Mojo dla DDJ, zauważył, że odtąd, z ruchem semantyki, const na wartościach zwrotu powinno być lepiej zbanowane, a wcześniejsza rada Scotta zignorowana.


Teraz nigdy nie zadałem sobie trudu, aby nauczyć się różnych specjalistycznych akronimów RVO, takich jak NRVO i tak dalej. Głównym powodem jest to, że zmieniono znaczenie w znaczeniu, początkowo mającym jedno znaczenie z pewną niestandardową funkcjonalnością w kompilatorze g ++. Terminologia tutaj jest po prostu bałaganem.

Tak więc, jeśli moja terminologia jest zła i naprawdę powinienem użyć innego akronimu, prosimy o poprawienie! :-)

+0

+1 dobry punkt dotyczący semantyki ruchu, chociaż to mnie zastanawia: więc co jest nie tak z wyłączaniem semantyki ruchu z wartością const return? Czy RVO (który całkowicie unika instancji obiektu) jest jeszcze lepszy niż ruch (który musi nadal tworzyć obiekt i wykonywać prace konserwacyjne w celu wykonania rzeczywistego ruchu)? – Mehrdad

+0

@Mehrdad: przenoszenie semantyki jest pod kontrolą programisty, a kompilator nie ma nic do powiedzenia, podczas gdy RVO jest pod kontrolą kompilatora, a programista prawie nic nie mówi. na przykład wywołanie może być przypisaniem 's = foo()' zamiast inicjowania. wtedy 'const' zapobiega przesuwaniu bufora wyniku ciągu funkcji: najprawdopodobniej zostanie skopiowany, z ewentualnym przydzieleniem innego bufora. –

+0

Dobra, ale * jeśli * Wiem, że RVO się dzieje, to * nigdy * (w praktyce) będzie wolniejsze niż ruch, prawda? Tak więc pod względem wydajności, jeśli możesz zapewnić RVO, to zwracanie 'const' jest lepsze niż zwracanie mutable? – Mehrdad

Powiązane problemy