นอกจากสิ่งที่ผู้เข้าชมพูดไว้:
ฟังก์ชั่นvoid emplace_back(Type&& _Val)
ให้โดย MSCV10 push_back(Type&& _Val)
ไม่สอดคล้องและซ้ำซ้อนเพราะในขณะที่คุณสังเกตเห็นว่ามันเป็นอย่างเคร่งครัดเทียบเท่ากับ
แต่รูปแบบ C ++ 0x ที่emplace_back
แท้จริงนั้นมีประโยชน์จริง ๆ : void emplace_back(Args&&...)
;
แทนที่จะใช้value_type
มันจะใช้รายการอาร์กิวเมนต์ที่หลากหลายดังนั้นหมายความว่าตอนนี้คุณสามารถส่งต่ออาร์กิวเมนต์ได้อย่างสมบูรณ์และสร้างวัตถุลงในคอนเทนเนอร์โดยตรงโดยไม่ต้องหยุดชั่วคราวเลย
นั่นมีประโยชน์เพราะไม่ว่า RVO และความหมายของการย้ายความหมายจะมาที่ตารางยังมีกรณีที่ซับซ้อนซึ่ง push_back น่าจะทำสำเนาที่ไม่จำเป็น (หรือย้าย) ตัวอย่างเช่นด้วยinsert()
ฟังก์ชันดั้งเดิมของ a std::map
คุณต้องสร้างชั่วคราวซึ่งจะถูกคัดลอกไปยัง a std::pair<Key, Value>
ซึ่งจะถูกคัดลอกลงในแผนที่:
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);
เหตุใดพวกเขาจึงไม่ใช้เวอร์ชันที่ถูกต้องของ emplace_back ใน MSVC ที่จริงมันเรียกร้องให้ผมเกินไปในขณะที่ที่ผ่านมาดังนั้นฉันถามคำถามเดียวกันในVisual C ++ บล็อก นี่คือคำตอบจาก Stephan T Lavavej ผู้ดูแลระบบอย่างเป็นทางการของการใช้งานไลบรารีมาตรฐาน Visual C ++ ที่ Microsoft
ถาม: ฟังก์ชั่น Beta 2 emplace เป็นเพียงตัวยึดตำแหน่งบางประเภทใช่ไหม?
ตอบ: อย่างที่คุณทราบเทมเพลตแบบแปรผันจะไม่ถูกนำมาใช้ใน VC10 เราจำลองพวกเขาด้วยเครื่องจักร preprocessor สำหรับสิ่งที่ต้องการ
make_shared<T>()
, tuple และสิ่งใหม่ ๆ <functional>
ใน เครื่องจักร preprocessor นี้ค่อนข้างยากต่อการใช้และบำรุงรักษา นอกจากนี้ยังส่งผลต่อความเร็วในการรวบรวมอย่างมากเนื่องจากเราต้องรวมส่วนหัวย่อยซ้ำ ๆ เนื่องจากข้อ จำกัด ด้านเวลาและข้อ จำกัด ด้านความเร็วในการรวบรวมเราจึงไม่ได้จำลองเทมเพลต Variadic ในฟังก์ชัน emplace ของเรา
เมื่อมีการนำเท็มเพลต Variadic มาใช้ในคอมไพเลอร์คุณสามารถคาดหวังได้ว่าเราจะใช้ประโยชน์จากพวกมันในไลบรารีรวมถึงในฟังก์ชัน emplace ของเรา เราให้ความสอดคล้องอย่างจริงจัง แต่น่าเสียดายที่เราไม่สามารถทำทุกอย่างได้ในครั้งเดียว
เป็นการตัดสินใจที่เข้าใจง่าย ทุกคนที่พยายามเพียงครั้งเดียวเพื่อจำลองเทมเพลต Variadic ด้วยเทคนิคที่น่ากลัวล่วงหน้ารู้วิธีที่น่าขยะแขยงสิ่งนี้ได้รับ