E 'legale per un compilatore C++ 0x per ottimizzareÈ legale l'ottimizzazione C++ 0x?
int func(int&& a){
a = 3;
return a;
}
a
int func(int&& a){
return 3;
}
? (o per un'altra POD)
E 'legale per un compilatore C++ 0x per ottimizzareÈ legale l'ottimizzazione C++ 0x?
int func(int&& a){
a = 3;
return a;
}
a
int func(int&& a){
return 3;
}
? (o per un'altra POD)
non così per sé, perché la funzione deve modificare la variabile a
equivalente. Detto questo, dopo inlining e un po 'di ottimizzazione banale il risultato sarà lo stesso:
int x = func(5);
// pseudo-inlined:
int __temp = 5; // the temporary created by binding 5 to int&&
__temp = 3; // a = 3;
int x = __temp; // return a;
// constant propagation:
int __temp = 5;
__temp = 3;
int x = 3;
// dead-code elimination:
int x = 3;
Nota il risultato è lo stesso come se si è utilizzato la seconda definizione di func
e inline, solo perché la variabile temporanea wasn' usato Ciò dimostra che le due funzioni non sono equivalenti in generale:
int modifyme = 100;
int x = func(std::move(modifyme));
// modifyme must be 3, second function definition wouldn't do that
Avrei pensato che leggere il valore di un oggetto dopo averlo spostato è UB. Non è questo il caso? –
Anche questo pensiero - sarei estremamente sorpreso se questo non fosse il caso, anche se per i tipi primitivi lasciare solo il valore è l'opzione più economica ovviamente (per tipi complessi non possono farlo anche se penserei?) – Voo
Pensavo anche che sarebbe stato UB, almeno per i POD (senza distruttori). Naturalmente per i non-POD devono essere cambiati in modo che tutti i puntatori possano essere impostati su 0 in modo che il distruttore non faccia nulla ... – Emil