2012-05-09 8 views
6

La semantica di spostamento può essere utile quando il compilatore non può utilizzare RVO e NRVO. Ma in tal caso il compilatore non può utilizzare queste funzionalità?Quando un compilatore non può utilizzare RVO o NRVO?

+0

Controllare questa domanda: [C++: Evitare la copia con l'affermazione “ritorno”] (http://stackoverflow.com/questions/10476665/c-avoiding-copy-with-the- dichiarazione di ritorno) :) – LihO

risposta

5

La risposta è che è dipendente dal compilatore e dalla situazione. Per esempio. il controllo del branching del flusso potrebbe confondere gli ottimizzatori. Wikipedia dare questo esempio:

#include <string> 
std::string f(bool cond = false) { 
    std::string first("first"); 
    std::string second("second"); 
    // the function may return one of two named objects 
    // depending on its argument. RVO might not be applied 
    return cond ? first : second; 
} 

int main() { 
    std::string result = f(); 
} 
3

Bene, non è tanto se il compilatore può utilizzare RVO, ma se in tal modo può evitare una costruzione di copia.

considerare:

struct Blah 
{ 
    int x; 
    Blah(int const _x): x(_x) { cout << "Hum de dum " << x << endl; } 
}; 

Blah foo() 
{ 
    Blah const a(1); 
    if(fermatWasRight()) { return Blah(2); } 
    return a; 
} 

Ottenere gli effetti collaterali (in uscita dal costruttore) proprio qui, è a prima vista piuttosto incompatibile con la costruzione a directy in deposito previsto dal chiamante. Ma se il compilatore è abbastanza intelligente allora può notare che distruggere questo oggetto è un'operazione nulla. E più in generale, per qualsiasi situazione particolare, se il compilatore è abbastanza intelligente allora forse può riuscire a evitare un'operazione di copia, non importa quanto designiamo il codice in modo subdolo.

Non sono sicuro del formale, ma quanto sopra, con più carico utile nell'oggetto in modo che la copia sia più costosa, è un caso in cui la semantica del movimento può essere d'aiuto, in modo che l'ottimizzazione sia garantita a prescindere dal intelligenza del compilatore (o meno).

Problemi correlati