Funkcja musi zwrócić dwie wartości do osoby dzwoniącej. Jaki jest najlepszy sposób wdrożenia?Czy RVO stanie się po powrocie std :: pair?
Wariant 1:
pair<U,V> myfunc()
{
...
return make_pair(getU(),getV());
}
pair<U,V> mypair = myfunc();
Wariant 1.1:
// Same defn
U u; V v;
tie(u,v) = myfunc();
Opcja 2:
void myfunc(U& u , V& v)
{
u = getU(); v= getV();
}
U u; V v;
myfunc(u,v);
wiem z opcja2, brak kopii/przenosi ale wygląda brzydko. Czy będą jakieś kopie/ruchy w Opcjach 1, 1.1? Załóżmy, że U i V są dużymi obiektami obsługującymi operacje kopiowania/przenoszenia.
Q: Czy to teoretycznie możliwe za optymalizacje RVO/NRVO zgodnie z normą? Jeśli tak, czy został już zaimplementowany gcc lub jakikolwiek inny kompilator?
Nic nie wiem o 'std :: pair', która mogłaby zahamować RVO/NRVO. Zazwyczaj dość łatwo jest przetestować, włączając w to konstruktor kopii, który powie ci, kiedy kopia się wydarzy. –
g ++ implementuje RVO, które uniemożliwia skopiowanie pary, jednak nadal masz kopię u i v do pary. –
Przeprowadziłem kilka testów i okazało się, że za pomocą g ++, który z nich był szybszy, zależało od tego, co było możliwe, oraz od złożoności konstruktorów kopii dla U i V. Jeśli szukasz tylko wydajności, myślę, że będziesz profilować go, aby ustalić, który jest najszybszy. –