Una funzione deve restituire due valori al chiamante. Qual è il modo migliore per implementare?RVO si verifica quando si restituisce std :: pair?
Opzione 1:
pair<U,V> myfunc()
{
...
return make_pair(getU(),getV());
}
pair<U,V> mypair = myfunc();
Opzione 1.1:
// Same defn
U u; V v;
tie(u,v) = myfunc();
Opzione 2:
void myfunc(U& u , V& v)
{
u = getU(); v= getV();
}
U u; V v;
myfunc(u,v);
so che con Option2, non ci sono copie/si muove ma sembra brutto. Ci saranno copie/mosse in Option1, 1.1? Supponiamo che U e V siano oggetti enormi che supportano entrambe le operazioni di copia/spostamento.
Q: È teoricamente possibile per qualsiasi ottimizzazione RVO/NRVO secondo lo standard? Se sì, gcc o qualsiasi altro compilatore è già implementato?
Non so nulla di 'std :: pair' che inibisce RVO/NRVO. È generalmente abbastanza facile da testare includendo un costruttore di copie che ti dice quando avviene una copia. –
g ++ implementa RVO che impedisce di copiare la coppia, tuttavia si ha ancora la copia di uev nella coppia. –
Ho eseguito alcuni test e ho scoperto che con g ++, quale era più veloce dipendeva molto da cosa fosse possibile l'inlining e la complessità dei costruttori di copie per U e V. Se stai cercando prestazioni, penso che devi profilare per determinare quale è il più veloce. –