Ziyaretçilerin söylediklerine ek olarak:
void emplace_back(Type&& _Val)
MSCV10 tarafından sağlanan işlev uyumsuz ve gereksizdir, çünkü belirttiğiniz gibi kesinlikle buna eşdeğerdir push_back(Type&& _Val)
.
Ancak gerçek C ++ 0x formu emplace_back
gerçekten yararlıdır void emplace_back(Args&&...)
:;
value_type
Bunu almak yerine değişken bir argüman listesi alır, böylece artık argümanları mükemmel bir şekilde iletebilir ve geçici olarak hiç bir nesneyi doğrudan bir kaba inşa edebilirsiniz.
Ne kadar zekice RVO ve semantik hareket tabloya getirmek olursa olsun, bir push_back'in gereksiz kopyalar oluşturması (veya taşıması) hala karmaşık durumlar vardır. Örneğin, a'nın geleneksel insert()
işleviyle, std::map
daha sonra a'ya kopyalanacak ve std::pair<Key, Value>
daha sonra haritaya kopyalanacak bir geçici oluşturmanız gerekir:
std::map<int, Complicated> m;
int anInt = 4;
double aDouble = 5.0;
std::string aString = "C++";
// cross your finger so that the optimizer is really good
m.insert(std::make_pair(4, Complicated(anInt, aDouble, aString)));
// should be easier for the optimizer
m.emplace(4, anInt, aDouble, aString);
Peki neden MSVC'de emplace_back'in doğru sürümünü uygulamadılar? Aslında, bir süre önce beni rahatsız etti, bu yüzden aynı soruyu Visual C ++ blogunda sordum . İşte Microsoft'un Visual C ++ standart kütüphane uygulamasının resmi sürdürücüsü Stephan T Lavavej'in cevabı.
S: Beta 2 emplace fonksiyonları şu anda sadece bir çeşit yer tutucu mu?
C: Bildiğiniz gibi VC10'da varyasyon şablonları uygulanmaz. Onları make_shared<T>()
, tuple ve içindeki yeni şeyler için önişlemci makineleri ile simüle ediyoruz
<functional>
. Bu önişlemci makinesinin kullanımı ve bakımı nispeten zordur. Ayrıca, alt başlıkları tekrar tekrar eklememiz gerektiğinden derleme hızını önemli ölçüde etkiler. Zaman kısıtlamaları ve derleme hızı endişelerimizin bir kombinasyonu nedeniyle, emplace fonksiyonlarımızda varyasyon şablonları simüle etmedik.
Derleyiciye varyasyon şablonları uygulandığında, emplace fonksiyonlarımız da dahil olmak üzere kütüphanelerden bunlardan faydalanmamızı bekleyebilirsiniz. Uyumu çok ciddiye alıyoruz, ancak ne yazık ki, her şeyi aynı anda yapamayız.
Bu anlaşılabilir bir karardır. Önişlemci korkunç hileleri ile varyasyon şablonu taklit etmeye sadece bir kez deneyen herkes, bu şeylerin ne kadar iğrenç olduğunu bilir.