आगंतुक ने क्या कहा इसके अलावा:
void emplace_back(Type&& _Val)
MSCV10 द्वारा प्रदान किया गया फ़ंक्शन गैर-अनुरूप और अनावश्यक है, क्योंकि जैसा कि आपने उल्लेख किया है कि यह कड़ाई से समकक्ष है push_back(Type&& _Val)
।
लेकिन वास्तविक C ++ 0x रूप emplace_back
वास्तव में उपयोगी है void emplace_back(Args&&...)
:;
इसके बजाय value_type
इसे लेने के लिए तर्कों की एक वैरेडिक सूची लेता है, तो इसका मतलब है कि आप अब तर्कों को पूरी तरह से आगे बढ़ा सकते हैं और सीधे एक कंटेनर में एक वस्तु का निर्माण कर सकते हैं जो बिना किसी अस्थायी के है।
यह उपयोगी है क्योंकि कोई फर्क नहीं पड़ता कि कितनी चालाकी से आरवीओ और मेज पर लाए जाने वाले शब्दार्थ अभी भी जटिल मामले हैं जहां एक पुश_बैक अनावश्यक प्रतियां (या स्थानांतरित) करने की संभावना है। उदाहरण के लिए, a के पारंपरिक insert()
फ़ंक्शन के साथ std::map
, आपको एक अस्थायी बनाना होगा, जिसे बाद में एक में कॉपी किया 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);
तो उन्होंने MSVC में emplace_back के सही संस्करण को लागू क्यों नहीं किया? वास्तव में, इसने मुझे कुछ समय पहले ही खराब कर दिया था, इसलिए मैंने विजुअल C ++ ब्लॉग पर एक ही सवाल पूछा । यहाँ Microsoft पर Visual C ++ मानक पुस्तकालय कार्यान्वयन के आधिकारिक अनुचर Stephan T Lavavej का जवाब है।
प्रश्न: क्या बीटा २ एम्प्ले अभी कुछ प्रकार के प्लेसहोल्डर हैं?
A: जैसा कि आप जानते हैं, VC10 में वैरेडिक टेम्प्लेट लागू नहीं किए जाते हैं। हम उन चीजों के लिए प्रीप्रोसेसर मशीनरी के साथ अनुकरण करते हैं make_shared<T>()
, जैसे
, टपल और नई चीजें <functional>
। यह प्रीप्रोसेसर मशीनरी का उपयोग करना और बनाए रखना अपेक्षाकृत कठिन है। इसके अलावा, यह संकलन गति को महत्वपूर्ण रूप से प्रभावित करता है, क्योंकि हमें बार-बार सबहेडर्स को शामिल करना होगा। हमारे समय की कमी और संकलन गति की चिंताओं के संयोजन के कारण, हमने अपने इमप्ले फ़ंक्शंस में वैरिएबल टेम्प्लेट की नकल नहीं की है।
जब संकलक में वेरैडिक टेम्प्लेट कार्यान्वित किए जाते हैं, तो आप अपेक्षा कर सकते हैं कि हम पुस्तकालयों में उनका लाभ उठाएँ, जिसमें हमारे ईमेक फ़ंक्शंस भी शामिल हैं। हम अनुरूपता को बहुत गंभीरता से लेते हैं, लेकिन दुर्भाग्य से, हम सब कुछ एक बार में नहीं कर सकते।
यह समझ में आने वाला फैसला है। हर कोई जो एक बार प्रीप्रोसेसर भयानक चाल के साथ वैरेडिक टेम्पलेट का अनुकरण करने की कोशिश करता है, जानता है कि इस सामान को कितना घृणित किया जाता है।