6

ı bir işlevi var diyelim:Dönüş değerleri C++ 0x'da rvalue başvurusu ile mi iletilecek?

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

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

mu C++ 0x özellikle sahte kopya randomVector dönüş değerinden önlenebilecektir demek? Ya da bir derleyicinin RVO'yu hayata geçirmesi gerekir mi? Bana randomVector() değeri bir değer olarak değerlendirilmeli gibi görünüyor ve bu nedenle v'nin hareket kurucusu çağrılmalı, ancak bunun doğru olduğuna emin değilim.

+0

İyi bir soru değil, IMHO. Standart, bir uygulamanın ne yapabileceğini, ne yapması gerektiğini, ne yapması gerektiğini belirtemez. –

+0

Gerçekte, verdiğiniz örnekte, Dönüş Değerinin Optimizasyonu, çoğu derleyici tarafından gerçekleştirilir ... Bu nedenle, rengin olmadığı durumlarda etkilidir. Ayrıca, argümanların işlevlere geçirilmesi için de rengin daha önemlidir. – Artyom

+0

Sorunun başlığı biraz yanıltıcıdır. İşleviniz bir referans değil, bir değer döndürür. Ancak bir rvalue referansı, kopya elisyonunun bir nedenden dolayı gerçekleştirilememesi ve türün bir hareket-yapıcıya sahip olması durumunda gerçekleşen bir bağlantıya bağlanabilir (Hareket-yapıcının parametresi bir referans değerdir) – sellibitze

cevap

7

kuraldır derleyici RVO yapabiliyorsa, o zaman bunu yapmak için izin ve hiçbir kopyası ve hiçbir hamle yapılır edilir

  • aşağıdaki.
  • Aksi takdirde, uygun kurucu alınır. Çünkü bir rvalue referans bir lvalue referans daha iyi bir rvalue bağlanan söylüyor 13.3.3.2/3 bir kural içinde,

Dediğiniz gibi, geçici bir rvalue ve dolayısıyla hareket yapıcı seçilir. Hareket veya kopya kurucunun kullanılıp kullanılmayacağına karar verirken, yük yapıcısını tercih etmek için aşırı yüklenme çözünürlüğü olacaktır.

Derleyicinin RVO gerçekleştirmesine izin verilen kural 12.8/15 adresinde yazılmıştır.

2

Tüm geri dönüş değerleri rvalues olarak kabul edilir, bu yüzden derleyici bu durumda RVO uygulamıyorsa, kopya oluşturucu yerine hareket yapıcıyı kullanmalıdır.

+1

Nasıl yapıldığından emin değilim "hareketi kullanmalıdır" yorumlamak için. AFAIU, U/NRVO desteğiyle bir derleyici kabul etti, karar akışı aşağıdaki gibidir:1) RVO dostu ise, herhangi bir taşıma/kopyalama işlemini en iyi duruma getirin, 2) eğer başka bir kurucu varsa, 3) kullanın. kurucu kullanılabilir, kullanın 4) başka kötü biçimlendirilmiş program – mloskot

+0

@mloskot Hareket kurucusunun, kopya oluşturucudan daha fazla yüklenmeye uygun olduğundan seçildiği anlamına gelir. – Motti

+2

Anladım. Ctor'u hareket ettiren örtük varsayım benim için açık değildi. Hareket ctor seçildiğinde, ancak sadece varsa. – mloskot