2013-01-20 12 views
6

Diciamo che ho la funzioneUn compilatore C++ può eseguire RVO per un valore di ritorno const?

#include <string> 

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

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

Can un compilatore svolgere (nome) return-valore di ottimizzazione per t, anche se i tipi di s e t sono sia diverso dal tipo di ritorno di foo a causa della const -ness differenza?

(Se la risposta è diversa per C++ 03 e C++ 11 allora io sono sicuramente interessati a conoscere la risposta C++ 03).

+0

Perché non includi i risultati dei tuoi esperimenti con almeno un compilatore? –

+0

@MarcGlisse: Bene, Visual C++ 2008 lo ha ottimizzato, ma non sono sicuro che lo standard lo permetta o meno. – Mehrdad

risposta

7

Non v'è alcun modo per l'ottimizzazione RVO per rompere il promessa di un const, quindi non c'è alcun problema: RVO può essere eseguito.


Tuttavia, semantica move è influenzata dal const. Disattiva efficacemente la semantica del movimento, ovvero le chiamate di un costruttore T(T&&) o dell'operatore di spostamento. Quindi, in generale, non utilizzare const su un valore restituito.

Scott Meyers originariamente raccomandava const sui valori restituiti, per una codifica più sensata.

Quindi Andrei Alexandrescu, nel suo articolo su Mojo per DDJ, ha osservato che d'ora innanzi, con la semantica di spostamento, const sui valori di ritorno dovrebbe essere meglio vietato e il precedente consiglio di Scott è stato ignorato.


Ora non mi sono mai preso la briga di imparare i vari acronimi RVO specializzati, come NRVO e così via. E una ragione principale è che questi hanno cambiato significato a a metà, originariamente con un significato con alcune funzionalità personalizzate nel compilatore g ++. La terminologia qui è solo un casino.

Quindi, se la mia terminologia è errata e dovrei davvero aver usato qualche altro acronimo, quindi non esitate a correggere! :-)

+0

+1 buon punto per quanto riguarda la semantica del movimento, anche se mi chiedo: cosa c'è di sbagliato nel disabilitare la semantica del movimento con un valore di ritorno const? Non è RVO (che evita completamente di istanziare un oggetto) ancora meglio del movimento (che deve ancora creare un'istanza di un oggetto e fare lavori di manutenzione per eseguire la mossa effettiva)? – Mehrdad

+0

@Mehrdad: spostare la semantica è sotto il controllo del programmatore, e il compilatore non ha voce in capitolo, mentre RVO è sotto il controllo del compilatore, e il programmatore non ha quasi voce in capitolo. per esempio, la chiamata potrebbe essere un assegnamento 's = foo()' invece di un'inizializzazione. quindi 'const' impedisce di spostare il buffer del risultato della stringa di funzione: molto probabilmente verrà copiato, con eventualmente ancora un altro buffer allocato. –

+0

Ok, ma * se * so che RVO sta accadendo, * mai * (in pratica) sarà più lento di una mossa, giusto? Quindi, per quanto riguarda le prestazioni, se riesci a garantire RVO, restituire "const" è meglio che restituirlo mutabile? – Mehrdad