push_back vs emplace_back
Biraz fark konusunda kafası karışık push_back ve emplace_back arasında kaldım.
void emplace_back(Type&& _Val);
void push_back(const Type& _Val);
void push_back(Type&& _Val);
Push_back aşırı rvalue başvuru alma gibi oldukça emplace_back amacı olur anlamadım?
CEVAP
Dedi ki: ne ek olarak
Fonksiyon void emplace_back(Type&& _Val)
MSCV10 tarafından sağlanan sizin de belirttiğiniz gibi kesinlikle push_back(Type&& _Val)
eşdeğer olduğundan uygun olmayan ve gereksiz.
Ama emplace_back
şeklinde çok yararlıdır gerçek C 0 x: void emplace_back(Args&&...)
;
value_type
almak yerine bağımsız değişken variadic bir listesini alır, şimdi mükemmel bir argüman ileri ve doğrudan geçici olmadan bir kabın içine bir nesne oluşturmak hiç anlamına gelir.
O rvt li ve hareket semantik ne olursa olsun hala bir push_back gereksiz kopyalar (veya hareket) en karmaşık durumlar var masaya getirmek için kullanışlıdır. Örneğin, geleneksel insert()
fonksiyon std::map
, oluşturmak için bir geçici, sonra da kopyalanacak bir std::pair<Key, Value>
, sonra da kopyalanacak içine harita :
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);
Neden MSVC emplace_back doğru sürümü uygulamak olmadı ? Aslında Visual C blog aynı soruyu sordum ben de bir süre önce rahatsız. İşte Stephan gelen cevap T Lavavej, Microsoft Visual C standart kütüphane uygulaması resmi yazar.
Soru : beta 2 emplace fonksiyonları şu an tutucu falan mısın ?
, Variadic şablonları bildiğiniz Gibi bir : VC10 uygulanan değil. Biz işleyişi ile onları taklit işler makine gibi
make_shared<T>()
, demet ve yeni<functional>
şeyler. Bu basit makine nispeten zor kullanmak ve korumak. Ayrıca, önemli ölçüde derleme etkiler sürekli olarak hız, subheaders vardır. Bir nedeniyle bizim zaman kısıtlamaları kombinasyonu ve derleme endişeleri, hız variadic şablonları taklit yok emplace bizim fonksiyonlar.Variadic şablonları zaman derleyici uygulanır, yararlanmak edeceğiz bekliyoruz kütüphanelerde onları da dahil olmak üzere emplace fonksiyonları. Alıyoruz çok ciddiyim, ama uygunluğu ne yazık ki her şey yapamayız tek seferde.
Anlaşılabilir bir karar. Basit hileler nasıl korkunç ve iğrenç şeyler oluyor ile sadece bir kez variadic şablon taklit etmeye çalışan herkese.
push_back vs emplace_back...
::push_back vector) kullanır değeri, s...
Neden bir vektör içine bir unique_ptr ...
Güvenli aynı vector öğesinden push_bac...
Std::Kopyalama Bir push_back ile nesne...