2013-02-17 51 views
5

के माध्यम से स्मृति आवंटन के बीच क्या अंतर है new/malloc और allocator के माध्यम से स्मृति आवंटन के बीच क्या अंतर है?नए और आवंटक

यदि हमारे पास new और malloc के विकल्प हैं तो हमें कभी भी वेक्टर के लिए एक अलग मेमोरी आवंटक की आवश्यकता क्यों होगी?

+1

1 google search: http://wiki.answers.com/Q/What_is_the_difference_between_malloc_and_new_other_than_syntax –

+2

फ्लोरिस वेलेमैन, मैं नए और हटाए जाने के बीच अंतर की तलाश नहीं कर रहा था। – BJC

+3

हम्म। मैं नहीं देखता कि "डुप्लिकेट" इस विशिष्ट प्रश्न का उत्तर कैसे देता है। खैर, शायद आंशिक रूप से ("आवंटक प्लग करने योग्य हैं") लेकिन यह आवंटन और निर्माण के बीच अंतर के बारे में विशिष्ट प्रश्न को संबोधित नहीं करता है। मुझे डाउनवोट के कारण का भी यकीन नहीं है। –

उत्तर

1

एह, मुझे लगता है कि new और malloc अलग हैं और allocator विभिन्न कार्य प्रदान करता है। malloc गैर प्रारंभिक डेटा देता है, और callocशून्य -ed डेटा देता है। लेकिन new कन्स्ट्रक्टर को कॉल करेगा यदि आप कुछ वर्ग का उदाहरण बना रहे हैं (int, bool इन आदिम प्रकार, जो, वैसे भी, प्रारंभ में भी शुरू किया जा सकता है)। delete विनाशक को कॉल करेगा, जबकि free नहीं है।

allocator के लिए, यह उपयोगकर्ता के लिए अमूर्तता की एक परत प्रदान करता है। allocator निर्मित ऑब्जेक्ट, गैर-प्रारंभिक मेमोरी स्पेस, या ऑब्जेक्ट को नष्ट कर सकता है या स्पेस को रिहा कर सकता है। स्मृति स्थान प्राप्त करने और ऑब्जेक्ट बनाने के लिए एसटीएल कंटेनर allocator का उपयोग करते हैं।

लेकिन ध्यान दें कि कस्टम allocator के रूप में संभव है, एक allocator जरूरी स्मृति new/delete तरह का प्रबंधन नहीं है। यह स्मृति का एक बड़ा हिस्सा बना सकता है तो कुछ आवंटन कैश करें। यह डिस्क पर फ़ाइलों पर मैप किए गए क्षेत्रों में मेमोरी एड्रेस लौटा सकता है ताकि आंतरिक डेटा फाइल सिस्टम में जा सके क्योंकि यह ऊपरी परत, कंटेनर द्वारा संशोधित है। स्मृति प्राप्त करने के लिए यह new पर भी कॉल कर सकता है। इस तरह, allocator उपयोगकर्ता को कंटेनरों का निर्माण करने में सक्षम बनाता है जो स्मृति के विशिष्ट क्षेत्रों में स्थित हैं। तो, allocator एस के साथ, कंटेनरों का आंतरिक तर्क स्मृति संग्रहण प्रबंधित करने के तरीके से अलग किया जाता है।

दरअसल आप ऊपर उल्लिखित प्रत्येक सुविधा को लागू करने के लिए std::allocator से प्राप्त कक्षा लिख ​​सकते हैं।


आप allocator रों पर एक अधिक विस्तृत चर्चा के लिए this भी पढ़ सकते हैं।

2

जब आप नए या मॉलोक का उपयोग करते हैं, तो स्मृति प्रबंधन आपके कंपाइलर के रनटाइम में संबंधित कार्यों के लिए हार्ड-वायर्ड होता है। इसके विपरीत, जब एक आवंटक का उपयोग किया जाता है, तो स्मृति प्रबंधन आवंटक को सौंप दिया जाता है, जो विनिमय योग्य होता है। यह आपको इस्तेमाल किए गए मेमोरी प्रबंधन कार्यों को बदलने की अनुमति देता है।

इस अतिरिक्त स्तर के अमूर्तता और नियंत्रण के कुछ अच्छे कारण हैं। उदाहरण के लिए देखें: Compelling examples of custom C++ STL allocators?

pointer allocate (size_type n, allocator<void>::const_pointer hint=0); 

संदर्भ के लिए of allocate() संकेत पैरामीटर अनुसार उल्लेख है कि आप एक नए ब्लॉक आवंटित करने के लिए की जरूरत है द्वारा प्रदर्शन को बेहतर बनाने के लिए इस्तेमाल किया जा सकता है:

0

allocator कक्षा में एक allocate() जो दो पैरामीटर के रूप में इस लेता है निर्दिष्ट एक के समीप स्मृति की। तो मैं संकेत का उपयोग कर विश्वास करता हूं कि आप ब्लॉक असाइन कर सकते हैं जैसे कि वे सरणी के मामले में अनुक्रमिक हैं।

0

एक आवंटक एक मेमोरी मैनेजर है। उदाहरण के लिए एसटीएल कंटेनर, डिफ़ॉल्ट आवंटकों को प्रदान करते हैं, लेकिन कोई भी इस आलेख में व्याख्या (एसटीएल आवंटकों के लिए एक ट्यूटोरियल) के रूप में उन्हें अनुकूलित कर सकता है: http://www.codeguru.com/cpp/cpp/cpp_mfc/stl/article.php/c4079/Allocators-STL.htm