सी में मानक मेमोरी हैंडलिंग फ़ंक्शंस malloc()
, realloc()
और free()
हैं। हालांकि, सी ++ stdlib आवंटकों में से केवल दो समानांतर: कोई पुनर्विक्रय कार्य नहीं है। बेशक, realloc()
जैसा बिल्कुल करना संभव नहीं होगा, क्योंकि स्मृति की प्रतिलिपि बनाना गैर-समग्र प्रकारों के लिए उपयुक्त नहीं है। लेकिन वहाँ के साथ, कहते हैं, इस समारोह एक समस्या हो जाएगा:सी ++ आवंटकों में कोई पुनर्वितरण कार्यक्षमता क्यों नहीं है?
bool reallocate (pointer ptr, size_type num_now, size_type num_requested);
जहां
ptr
पहलेnum_now
की वस्तुओं की संभाजक साथ आवंटित किया जाता है;num_requested
> =num_now
;
और शब्दों को इस प्रकार है:
- अगर संभाजक स्मृति ब्लॉक
ptr
पर आकार सेnum_now
वस्तुओं के लिएnum_requested
वस्तुओं को दी विस्तार कर सकते हैं, यह बहुत (अतिरिक्त मेमोरी छोड़ने अप्रारंभीकृत) करता है औरtrue
रिटर्न; - अन्यथा यह कुछ भी नहीं करता है और
false
देता है।
माना जाता है कि यह बहुत आसान नहीं है, लेकिन जैसा कि मैं समझता हूं, आवंटक, ज्यादातर कंटेनरों और कंटेनर कोड के लिए पहले से ही जटिल हैं।
को देखते हुए इस तरह के एक समारोह, std::vector
, कहते हैं, के रूप में (स्यूडोकोड) इस प्रकार हो जाना सकता है:
if (allocator.reallocate (buffer, capacity, new_capacity))
capacity = new_capacity; // That's all we need to do
else
... // Do the standard reallocation by using a different buffer,
// copying data and freeing the current one
Allocators कि पूरी तरह से बदल रहा स्मृति आकार के काबिल नहीं हैं सिर्फ बिना शर्त return false;
द्वारा इस तरह के एक समारोह को लागू कर सकते हैं।
क्या वहां कुछ कम पुनर्वितरण-सक्षम आवंटन कार्यान्वयन है जो परेशान करने के लायक नहीं होगा? या क्या कुछ समस्याएं हैं जिन्हें मैंने अनदेखा किया?
+1, यह एक सवाल है जो हमेशा मुझे खराब करता है। –
स्ट्रॉस्ट्रप इस चीज़ पर लेते हैं: http://www2.research.att.com/~bs/bs_faq2.html#renew; यह समस्या को वेक्टर की आंतरिक कार्यप्रणाली में प्रस्तुत करता है, लेकिन यह नहीं कहता कि सरणी को बढ़ाना आसान बनाने के लिए "नवीकरण" जैसी कोई तंत्र क्यों नहीं है। –
कुछ मामलों में ऐसा करने से 'std :: vector' को रोकना कुछ भी नहीं है (उदा।, यह मानक आवंटक का उपयोग करके जानता है)। मानक पुस्तकालय को अंतर्निहित प्रणाली के ज्ञान का उपयोग करने की अनुमति है। – KeithB