6

powiedzmy mam funkcję:Czy zwracane wartości będą przekazywane przez referencję rvalue w C++ 0x?

typedef std::vector<int> VecType; 
VecType randomVector(); 

int processing() 
{ 
    VecType v = randomVector(); 
    return std::accumulate(v.begin(), v.end(), 0); 
} 

Czy C++ 0x konkretnie znaczy nieprawdziwy kopia zostanie odwrócona od wartości zwracanej randomVector? A może kompilator musi wdrożyć RVO? Wydaje mi się, że wartość randomVector() powinna być traktowana jako wartość r, a zatem powinien zostać wywołany konstruktor ruchu v, ale nie jestem do końca pewien, czy to prawda.

+0

To nie jest dobre pytanie, IMHO. Standard nie może z pożytkiem określić, co może zrobić wdrożenie, tylko to, co MUSI zrobić. –

+0

Właściwie w podanym przykładzie podanym dla Optymalizatora wartości zwracanej przez większość kompilatorów ... jest to efektywne bez wartości rvalue. Również rvalue jest ważniejsza dla przekazywania argumentów do funkcji. – Artyom

+0

Tytuł pytania jest nieco mylący. Twoja funkcja zwraca wartość r, a nie referencję. Ale odwołanie do rwartowania może się z nim wiązać, co dzieje się w przypadku, gdy elizacja kopiowania nie może zostać wykonana z jakiegoś powodu, a typ ma konstruktor ruchu (parametr konstruktora ruchu jest odwołaniem do wartości r) – sellibitze

Odpowiedz

7

Zasada jest następująca

  • Jeśli kompilator może zrobić RVO, to może to zrobić, a nie kopia, a nie ruch jest wykonany.
  • W przeciwnym razie zostanie pobrany odpowiedni konstruktor.

jak mówisz, tymczasowy jest rvalue, a więc wybrano konstruktor posunięcie, ponieważ z reguły w 13.3.3.2/3, który mówi, że odniesienie RValue wiąże się rvalue lepsze niż odniesienie lwartości. Przy podejmowaniu decyzji, czy użyć konstruktora ruchu lub kopiowania, rozdzielczość przeciążania będzie preferować konstruktor ruchu.

Reguła, według której kompilator może wykonywać RVO, jest zapisana pod adresem 12.8/15.

2

Wszystkie wartości zwracane są uważane za rvalues, więc jeśli kompilator nie zaimplementuje RVO w tym przypadku, musi użyć konstruktora ruchu zamiast konstruktora kopiowania.

+1

Nie jestem pewien jak interpretować "musi używać ruchu". AFAIU, przyjmując kompilator z obsługą U/NRVO, proces decyzyjny wygląda następująco: 1) jeśli przyjazny dla RVO, zoptymalizuj wszelkie operacje przesuwania/kopiowania, 2) w przeciwnym razie, jeśli dostępny jest konstrator ruchu, użyj go 3) w przeciwnym razie, jeśli kopia konstruktor dostępny, użyj go 4) inny źle sformułowany program – mloskot

+0

@mloskot Mam na myśli konstruktor ruchu, ponieważ jest on lepiej dopasowany do przeciążania niż konstruktor kopiowania. – Motti

+2

Rozumiem. Domniemane założenie, że ctor istnieje, było dla mnie niejasne. Jako, że wybrano przeniesienie, ale tylko jeśli istnieje. – mloskot

Powiązane problemy