Wiem, że w C++ 11 semantyka ruchu została zaimplementowana w kontenerach STL w celu uniknięcia tymczasowych obiektów. A ludzie mówią, że teraz jest idealny do pisania funkcji, które zwracają wartość. Ale mam pewne nieporozumienia związane z ziemią, jak wiele razy unika się kopiowania. Zobacz poniższy przykład:Kontenery STL przenoszą semantykę i zwracają wartość: ile razy unika się kopiowania?
vector<int> myVector() {
vector<int> res;
res.push_back(4);
res.push_back(5);
return res;
}
vector<int> v = myVector();
moim rozumieniu jest to, że w C++ 03, myVector
zwraca kopię res
(4
, 5
kopiowane raz), przy ocenie vector<int> v = myVector();
vector<int>
„s kopia konstruktora vector<int>(const vector<int> &)
jest wywoływany (4
, 5
skopiowany dwukrotnie). Jednak w C++ 11 z semantyką ruchu, chcę się dowiedzieć, która kopia 4
i 5
zostanie ominięta? obie? Czy jest również wywoływana optymalizacja wartości zwracanej w celu skrócenia jednego czasu kopiowania: 4
i 5
?
W C++ 03, to dwie kopie, obie podlegają elizacji. W C++ 11 są to dwa ruchy, oba podlegające elizacji. –
Dlaczego są dwa ruchy? – Allanqunzi
Z tego samego powodu mogą istnieć dwie kopie w C++ 03 - przejście od 'res' do wartości zwracanej, a następnie przejście od tego do' v'. –