auto
मौन निहित रूपांतरणों से बचकर प्रदर्शन में सहायता कर सकता है । एक उदाहरण जो मुझे सम्मोहक लगा वह निम्नलिखित है।
std::map<Key, Val> m;
// ...
for (std::pair<Key, Val> const& item : m) {
// do stuff
}
बग देखें? यहाँ हम सोच रहे हैं कि हम अपने संदर्भ को स्पष्ट करने के लिए काग्रेस के संदर्भ में मानचित्र में हर एक वस्तु को ले रहे हैं और नई रेंज-फॉर एक्सप्रेशन का उपयोग कर रहे हैं, लेकिन वास्तव में हम हर तत्व की नकल कर रहे हैं । इसका कारण std::map<Key, Val>::value_type
है std::pair<const Key, Val>
, नहीं std::pair<Key, Val>
। इस प्रकार, जब हमारे पास (संक्षेप में):
std::pair<Key, Val> const& item = *iter;
किसी मौजूदा ऑब्जेक्ट का संदर्भ लेने और उस पर छोड़ने के बजाय, हमें एक प्रकार का रूपांतरण करना होगा। जब तक कोई अंतर्निहित रूपांतरण उपलब्ध हो, तब तक आपको किसी भिन्न प्रकार के ऑब्जेक्ट (या अस्थायी) के लिए एक कॉन्स्टिट्यूशन लेने की अनुमति दी जाती है:
int const& i = 2.0; // perfectly OK
जैसे रूपांतरण इसी कारण से आप एक में बदल सकते हैं के लिए एक की अनुमति दी अंतर्निहित रूपांतरण है const Key
एक करने के लिए Key
है, लेकिन हम आदेश है कि के लिए अनुमति देने के लिए नए प्रकार की एक अस्थायी निर्माण करने के लिए है। इस प्रकार, प्रभावी रूप से हमारा लूप करता है:
std::pair<Key, Val> __tmp = *iter; // construct a temporary of the correct type
std::pair<Key, Val> const& item = __tmp; // then, take a reference to it
(बेशक, वास्तव में कोई __tmp
वस्तु नहीं है, यह सिर्फ चित्रण के लिए है, वास्तव में अनाम अस्थायी बस item
अपने जीवनकाल के लिए बाध्य है )।
बस में बदल रहा है:
for (auto const& item : m) {
// do stuff
}
बस हमें एक टन प्रतियां बचाईं - अब संदर्भित प्रकार आरम्भिक प्रकार से मेल खाता है, इसलिए कोई अस्थायी या रूपांतरण आवश्यक नहीं है, हम सिर्फ एक प्रत्यक्ष संदर्भ कर सकते हैं।