c 11 Dönüş değeri iyileştirme veya hareket?
std::move
kullanmanız gereken zaman ve derleyici... örneğin optimize izin vermeliyim anlamam:
using SerialBuffer = vector< unsigned char >;
// let compiler optimize it
SerialBuffer read( size_t size ) const
{
SerialBuffer buffer( size );
read( begin( buffer ), end( buffer ) );
// Return Value Optimization
return buffer;
}
// explicit move
SerialBuffer read( size_t size ) const
{
SerialBuffer buffer( size );
read( begin( buffer ), end( buffer ) );
return move( buffer );
}
Hangisini kullanmalıyım?
CEVAP
Tüm dönüş değerleri zaten move
d veya başka optimize edilmiş, açıkça dönüş değerleri ile hareket etmeye gerek yok.
Derleyicilerizin verdigerekliotomatik olarak bir dönüş değeri (kopya optimize etmek için, ve hatta hareket optimize!
N3337 standart taslak, bölüm 12.8(C 11):
Belli kriterler yerine geldiğinde, bir uygulama atlamak için izin verilir kopyala kopyala/taşı bile sınıf bir nesnenin yapı taşı,/ nesne için yapıcı ve/veya yıkıcı yan etkileri var. İçinde bu gibi durumlarda, uygulama kaynak ve hedef davranır ihmal kopya başvuran sadece iki farklı yolu olarak taşıma işlemi/ aynı nesne ve o nesnenin yıkım gerçekleşir iki nesne helak olacaktı kez daha optimizasyon olmadan./Taşı işlemleri kopyalama,bu elision aradıelision kopyalayınmüsaade edilebilir aşağıdaki şartlar birden çok kopya ortadan kaldırmak için birleştirilebilir):
[...]
[Örnek:
class Thing { public: Thing(); ~Thing(); Thing(const Thing&); }; Thing f() { Thing t; return t; } Thing t2 = f();
Burada elision için kriterler sınıf kopya yapıcı
Thing
iki arama ortadan kaldırmak için birleştirilebilir: yerel otomatik nesne kopyalama işlevinin dönüş değeri olarak geçici bir nesnet
f()
ve geçici kopyalama nesnesinet2
nesne. Etkili bir şekilde, yerel nesne inşaatt
doğrudant2
, ve o nesnenin imha programı gerçekleşecek genel nesne başlatılıyor olarak görülebilir çıkın. Bir hareketThing
yapıcı ekleyerek aynı etkiye sahiptir, ama hareket gelen yapıdır elidedt2
geçici nesne. —son örnek]Kopyalama işlemiyle elision için şartlar ya da aslında tasarruf kaynağı olan karşılanacağı zaman nesne işlevi, parametre ve kopyalanacak nesne lvalue, aşırı bir kararı ile belirlenir kopya için yapıcı ilk nesnenin bir rvalue tarafından belirlenmiş olarak gerçekleştirilir seçin. Aşırı yüklemesi çözünürlük başarısız, ya da seçilen kurucu ilk parametre türü için rvalue başvurusu ise nesnenin (muhtemelen cv-nitelikli), aşırı çözümleme tipi, bir daha, bir nesne gibi düşünen yapılır lvalue.
Alma yöntemi 'null' veya...
saptayarak "koşullu atlama veya h...
Nasıl olsun Anahtarı ayırt edebilirim,...
Ne kadar zarif hesapların yapılabilmes...
Javascript olsun değeri veya özelliği ...