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?
risposta
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();
}
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).
- 1. Un compilatore C++ può eseguire RVO per un valore di ritorno const?
- 2. RVO si verifica quando si restituisce std :: pair?
- 3. Quando utilizzare (o non utilizzare) un delegato
- 4. Quando un compilatore può dedurre un parametro di modello?
- 5. RVO, operazioni di spostamento e un dilemma
- 6. Perché std :: move impedisce RVO?
- 7. Un riferimento non può essere NULL o può essere NULL?
- 8. non può interpretare avviso del compilatore
- 9. Quando utilizzare InvalidOperationException o NotSupportedException?
- 10. Un compilatore ottimizzante può aggiungere std :: move?
- 11. Un EntityManager JTA non può utilizzare getTransaction()
- 12. Quando utilizzare una query o un codice
- 13. Quando utilizzare limit e quando non su
- 14. Quando sai quando utilizzare un TreeSet o LinkedList?
- 15. RVO per complessi tipi definiti dall'utente in C++
- 16. Quando non utilizzare RegexOptions.Compiled
- 17. Come si può fare C++ quando il compilatore incorporato non ha l'operatore new o il supporto STL?
- 18. Un compilatore ANSI C può rimuovere un ciclo di ritardo?
- 19. Quando utilizzare NaN o +/- Infinity?
- 20. Quando utilizzare un Eventstore
- 21. Memorizzazione di un puntatore all'oggetto restituito con NRVO
- 22. Quando utilizzare CultureInfo.GetCultureInfo (String) o CultureInfo.CreateSpecificCulture (String)
- 23. Quando utilizzare un albero di sintassi astratto o concreto?
- 24. Quando utilizzare gli attori locali o remoti?
- 25. Branching che non può essere visto da compilatore
- 26. Il compilatore C non può creare file eseguibili - Cygwin/MiniGW
- 27. Compilatore infetto o malfunzionamento?
- 28. Quando utilizzare un oggetto o un array in javascript?
- 29. non può utilizzare un valore non definito come simbolo perl
- 30. Come si può fornire un compilatore/linker personalizzati per OpenSSL?
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