C++ 11'de, geçici nesneleri önlemek için hareket semantikleri STL kapsayıcılarında uygulandığını biliyorum. Ve insanlar şimdi değere göre dönen fonksiyonları yazmak için mükemmel olduğunu söylüyorlar. Ancak, yeryüzünde kopyalamanın kaç kez gerçekten önlendiğine dair kafa karışıklığım var. Aşağıdaki örneğe bakın lütfen:STL konteynırları semantiği taşıyor ve değere göre dönüyor: Kopyalamanın kaç katı uzaklaşılıyor?
vector<int> myVector() {
vector<int> res;
res.push_back(4);
res.push_back(5);
return res;
}
vector<int> v = myVector();
Benim anlayış lar yapıcı vector<int>(const vector<int> &)
çağrılır kopya vector<int> v = myVector();
vector<int>
' değerlendirirken C++ 03, myVector
, res
bir kopyasını (4
kez kopyalanmış 5
) döndürür olmasıdır (4
, 5
iki kez kopyalandı. Ancak hareket semantiği ile C++ 11'de, 4
ve 5
'un hangi kopyasından kaçınıldığını bilmek istiyorum? her ikisi de? Dönüş değeri optimizasyonu da, bir kez 4
ve 5
kopyalarını azaltmak için çağrılır mı?
C++ 03'te, her ikisi de elemenasyona tabi iki kopyadır. C++ 11'de, her ikisi de seçime tabi iki hamle. –
Neden iki hareket var? – Allanqunzi
Aynı nedenden dolayı C++ 03'te iki kopya olabilir - "res" den dönüş değerine bir hareket ve daha sonra "v" ye bir hareket. –