2013-01-20 19 views
6

en ı işlevi var diyelimBir C++ derleyici const geri dönüş değeri için RVO yapabilir mi?

#include <string> 

std::string const foo() 
{ 
    std::string s = "bar"; 
    return s; 
} 

int main() 
{ 
    std::string t = foo(); 
} 

Can gerçekleştirmek (adlandırılır) dönüş değeri optimizasyonu t için, s ve t tipleri foo dönüş türünden ikisi farklı olmasına rağmen nedeniyle const bir derleyici -ness farkı?

(cevap C++ 03 ve için farklı ise o zaman C++ 11 C++ 03 cevap bilerek kesinlikle ilgileniyorum.)

+0

Neden deneme sonuçlarınızı en az bir derleyiciyle eklemiyorsunuz? –

+0

@MarcGlisse: Visual C++ 2008 bunu en iyi duruma getirdi, ancak standardın gerçekten izin verip vermediğinden emin değilim. – Mehrdad

cevap

7

RVO optimizasyon kırmak için hiçbir yolu yoktur Bir const söz, bu yüzden sorun yok: RVO gerçekleştirilebilir.


Ancak hareket semantikconst etkilenir. Hareket anlambilimini etkin bir şekilde devre dışı bırakır, yani, bir T(T&&) yapıcısını veya hareket atama işlecini çağırır. Genel olarak, const değerini bir dönüş değeri olarak kullanmayın.

Scott Meyers, daha aklı kodlama için orijinal değer olarak const değerini önerdi. Daha sonra, DDJ için yazdığı Mojo makalesinde, Andrei Alexandrescu, hareket anlamıyla, const geri dönüş değerleri ile daha iyi yasaklanması gerektiğini ve Scott'ın daha önceki tavsiyesinin göz ardı edildiğini kaydetti.


Şimdi NRVO ve benzeri gibi çeşitli uzman RVO kısaltmaları öğrenmekten asla rahatsız olmadım. Ve bunun başlıca nedeni, bu 'un orjinal olarak anlamını değiştirmesidir, orijinal olarak g ++ derleyicisindeki bazı özel işlevselliklerle bir anlamı vardır. Buradaki terminoloji sadece bir karmaşadır.

Eğer terminolojimin yanlış ve gerçekten başka bir kısaltma kullanmış olsaydım, lütfen düzeltmek için çekinmeyin! :-)

+0

+1 anlambilimsel hareket etmeyle ilgili iyi bir nokta, ancak bu beni meraklandırıyor: öyleyse bir const dönüş değeriyle taşınırlığı hareket ettirmeyi devre dışı bırakmanın nesi yanlış? RVO (hala bir nesneyi örneklemeyi tamamen önleyen) hareket etmekten daha iyi değildir (bu, gerçek hareketi gerçekleştirmek için hala bir nesneyi başlatmalı ve bakım çalışması yapmalıdır)? – Mehrdad

+0

@Mehrdad: semantik, programlayıcı kontrolü altındadır ve derleyicide bunun bir anlamı yoktur, RVO ise derleyici kontrolü altındadır ve programcı neredeyse hiç söz söylemez. Örneğin, çağrı bir başlatma yerine 's = foo()' atanmış olabilir. daha sonra 'const ', işlev dizgisi sonucunun arabelleğini hareket ettirmeyi engeller: büyük olasılıkla, muhtemelen başka bir arabelleğe ayrılmış olan kopyalanır. –

+0

Tamam, ama * eğer * RVO'nun gerçekleştiğini biliyorum * asla * (pratikte) bir hamleden daha yavaş olacak, değil mi? Bu nedenle, performans açısından, RVO'yu sağlayabiliyorsanız, daha sonra 'const' iadesi dönebilir hale getirmekten daha iyidir? – Mehrdad

İlgili konular