Cppreference से च्वाइस कोट:
यह रनटाइम बहुरूपता वस्तुओं को पॉलीमोर्फिक_लोकेटर का उपयोग करने की अनुमति देता है जैसे कि वे समान स्थिर आवंटनकर्ता प्रकार के बावजूद रन समय पर विभिन्न आवंटन प्रकार का उपयोग करते हैं।
"नियमित" आवंटनकर्ताओं के साथ मुद्दा यह है कि वे कंटेनर के प्रकार को बदलते हैं। यदि आप vector
एक विशिष्ट आवंटनकर्ता के साथ चाहते हैं , तो आप Allocator
टेम्पलेट पैरामीटर का उपयोग कर सकते हैं :
auto my_vector = std::vector<int,my_allocator>();
अब समस्या यह है कि यह वेक्टर एक वेक्टर के समान नहीं है जो एक अलग आवंटनकर्ता के साथ वेक्टर है। आप इसे एक ऐसे फंक्शन में नहीं भेज सकते जिसके लिए डिफॉल्ट-एलोकेटर वेक्टर की आवश्यकता होती है, उदाहरण के लिए, या एक ही वेरिएबल / पॉइंटर के लिए एक अलग एलोकेटर टाइप के साथ दो वैक्टर असाइन करें, जैसे:
auto my_vector = std::vector<int,my_allocator>();
auto my_vector2 = std::vector<int,other_allocator>();
auto vec = my_vector; // ok
vec = my_vector2; // error
एक बहुरूपिक आबंटक एक सदस्य के साथ एक एकल आबंटक प्रकार है जो टेम्पलेट तंत्र के बजाय गतिशील प्रेषण के माध्यम से आवंटन व्यवहार को परिभाषित कर सकता है। यह आपको कंटेनर रखने की अनुमति देता है जो विशिष्ट, अनुकूलित आवंटन का उपयोग करते हैं, लेकिन जो अभी भी एक सामान्य प्रकार के हैं।
आवंटनकर्ता व्यवहार का अनुकूलन आवंटनकर्ता को देकर किया जाता है std::memory_resource *
:
// define allocation behaviour via a custom "memory_resource"
class my_memory_resource : public std::pmr::memory_resource { ... };
my_memory_resource mem_res;
auto my_vector = std::pmr::vector<int>(0, &mem_res);
// define a second memory resource
class other_memory_resource : public std::pmr::memory_resource { ... };
other_memory_resource mem_res_other;
auto my_other_vector = std::pmr::vector<int>(0, &mes_res_other);
auto vec = my_vector; // type is std::pmr::vector<int>
vec = my_other_vector; // this is ok -
// my_vector and my_other_vector have same type
मुख्य शेष मुद्दा, जैसा कि मैं इसे देखता हूं, यह है कि एक std::pmr::
कंटेनर अभी भी std::
डिफ़ॉल्ट आवंटनकर्ता का उपयोग करके समकक्ष कंटेनर के साथ संगत नहीं है । आपको उस समय कुछ निर्णय लेने की आवश्यकता होती है जब आप एक इंटरफ़ेस डिज़ाइन करते हैं जो एक कंटेनर के साथ काम करता है:
- क्या यह संभव है कि कंटेनर को कस्टम आवंटन की आवश्यकता हो?
- यदि ऐसा है, तो क्या मुझे एक टेम्पलेट पैरामीटर जोड़ना चाहिए (मध्यस्थ आवंटन के लिए अनुमति देने के लिए) या क्या मुझे एक पॉलीमॉर्फिक आवंटनकर्ता के उपयोग को अनिवार्य करना चाहिए?
एक टेम्पलेट समाधान एक पॉलीमॉर्फिक आवंटनकर्ता सहित किसी भी आवंटनकर्ता के लिए अनुमति देता है , लेकिन इसमें अन्य कमियां हैं (उत्पन्न कोड आकार, संकलन समय, कोड को हेडर फ़ाइल में उजागर किया जाना चाहिए, आगे "प्रकार संदूषण" की संभावना है जो समस्या को बाहर की ओर धकेलती रहती है)। दूसरी ओर एक पॉलीमॉर्फिक आवंटन समाधान यह निर्धारित करता है कि एक पॉलीमॉर्फिक आवंटन का उपयोग किया जाना चाहिए। यह std::
कंटेनर का उपयोग करने से रोकता है जो डिफ़ॉल्ट आवंटनकर्ता का उपयोग करता है, और विरासत कोड के साथ इंटरफेस के लिए निहितार्थ हो सकता है।
एक नियमित आवंटनकर्ता की तुलना में, एक पॉलीमॉर्फिक आवंटनकर्ता के पास कुछ मामूली लागतें होती हैं, जैसे कि मेमोरी_सोर्स पॉइंटर (जो कि सबसे अधिक नगण्य है) के भंडारण ओवरहेड और आवंटन के लिए वर्चुअल फ़ंक्शन प्रेषण की लागत। मुख्य समस्या, वास्तव में, शायद विरासत कोड के साथ संगतता की कमी है जो पॉलीमॉर्फिक आवंटनकर्ताओं का उपयोग नहीं करता है।
allocator<T>
स्वाभाविक रूप से कुछ समस्याओं को दूर करने की कोशिश करते हैं । यदि आप बार-बार आवंटन का उपयोग करते हैं तो आपको इसमें मान दिखाई देगा।