5

मैं raw_storage_iterator घटक के बारे में पढ़ रहा था टीसी ++ पी एल। इस घटक का उपयोग करके हमें प्रदर्शन लाभ मिलता है क्योंकि यह असाइनमेंट (अधिक महंगा) से बचाता है और प्रतिलिपि निर्माण का उपयोग करता है। यह मुझे लगा कि इसका अनुक्रम/कंटेनर में उपयोग किया जाना चाहिए जहां हमारे पास महत्वपूर्ण संख्या में तत्व हो सकते हैं और इसलिए असाइनमेंट कॉल की संख्या बहुत अधिक प्रभाव हो सकती है।क्या raw_storage_iterator घटक का उपयोग करता है सी में/फायदे ++

सैद्धांतिक रूप से इसकी स्पष्ट और यह मेरे लिए लग रहा था कि इस घटक कंटेनर प्रकार कक्षाओं के लिए उपयोगी है। हालांकि मैं समझना चाहता हूं कि इसका प्रदर्शन लाभ प्राप्त करने के लिए हमें थोड़ा सा विवरण में इस घटक (व्यावहारिक उदाहरणों के साथ) का उपयोग करना चाहिए?

+0

inb4 "cplusplus.com बेकार है, क्या आप इससे लिंक हिम्मत नहीं करते हैं"; यह ठीक कहता है, इसका उपयोग किया जाता है ताकि आप एल्गोरिदम के लिए गंतव्य के रूप में अनियमित स्मृति का उपयोग कर सकें। बैक इनसेटर इटरेटर के साथ आरक्षित वेक्टर के साथ प्रदर्शन बेहतर नहीं होना चाहिए। जब तक आप बहुत कम स्तर कोड लिख रहे हों, आपको इस इटरेटर की आवश्यकता नहीं है। – DanielKO

+0

@DanielKO एक बैक इनसेटर इटरेटर के साथ एक आरक्षित वेक्टर प्रत्येक डालने पर आकार जांच करना है। संकलक यह पता लगाता है कि आकार की जांच अनियंत्रित है अपेक्षाकृत असंभव है। आपको चेक पर अच्छी शाखा भविष्यवाणी मिलेगी, लेकिन यह अभी भी 'raw_storage_iterator' लेखन से कम होगी। – Yakk

उत्तर

3

cppreference पर नमूना कोड है।

आप कई तंत्रों के माध्यम से अनियमित स्मृति के गठबंधन ब्लॉक आवंटित कर सकते हैं। ऐसे बफर आवंटित करने के लिए cppreferences std::get_temporary_buffer<T> का उपयोग करता है।

फिर आप इन तत्वों के लिए सूचक बना सकते हैं। क्योंकि यह एक वैधT के लिए सूचक नहीं है, बल्कि स्मृति एक T के निर्माण के लिए उपयुक्त है के एक ब्लॉक करने के लिए सूचक का प्रकार, थोड़ा भ्रामक है।

std::raw_storage_iterator उस T* के साथ पॉप्युलेट किया जा सकता है और इसे आउटपुट करने के लिए कहा जाता है। फिर आप उस इटरेटर को एल्गोरिदम को खिला सकते हैं जो एक पारंपरिक आउटपुट इटरेटर की अपेक्षा करता है, और चीजें आसानी से चलती हैं।

यदि आपने raw_storage_iterator के बिना ऐसा करने का प्रयास किया है, तो आप एक गैर-निर्मित T को असाइन कर रहे होंगे, जो अपरिभाषित व्यवहार है। एक विकल्प के रूप में, आप T को आउटपुट करने से पहले बना सकते हैं - लेकिन यह अपमानजनक है, क्योंकि यह ऑब्जेक्ट को दो बार बनाता है।

मूल विचार मानक एल्गोरिदम में पास सही दक्षता के साथ अप्रारंभीकृत उत्पादन बफ़र्स के उपयोग की अनुमति है। यह ऐसा कुछ नहीं है जिसे आप कुछ गंभीर कोड माइक्रोप्टाइमाइज़ेशन के बाहर उपयोग करना चाहिए।

+0

इसके बजाए प्लेसमेंट का उपयोग करने के लिए यह एक अच्छी जगह नहीं होगी? इससे निर्मित ऑब्जेक्ट एक बार में आरक्षित स्थान पर जायेगा। यह अभी भी प्रोग्रामर को पर्याप्त जगह हासिल करने की आवश्यकता है, लेकिन ऐसा लगता है कि यह बेहतर प्रदर्शन और सुरक्षा के अनुसार हो सकता है। – Paul

+0

@paul यह इटरेटर प्लेसमेंट 'नया' का उपयोग करता है, बस इसे सौंपा जाने पर ही करता है। कच्चा भंडारण इटेटरेटर आपको इसे 'std' से कुछ एल्गोरिदम के आउटपुट के रूप में करने देता है - जिनमें से कुछ आप रोल को हाथ नहीं लेना चाहते हैं। – Yakk

संबंधित मुद्दे