यह वास्तव में किसी भी प्रकार की डेटा संरचना को लागू करने के लिए आवश्यक है जो सम्मिलित किए गए तत्वों की संख्या के लिए न्यूनतम मेमोरी की तुलना में अधिक मेमोरी आवंटित करता है (यानी, लिंक किए गए संरचना के अलावा कुछ भी जो एक समय में एक नोड आवंटित करता है)।
टेक कंटेनर की तरह unordered_map
, vector
या deque
। इन सभी की तुलना में आपके द्वारा अब तक डाले गए तत्वों के लिए हर एक प्रविष्टि के लिए ढेर आवंटन की आवश्यकता से बचने के लिए इन सभी को अधिक मेमोरी आवंटित करना आवश्यक है। vector
सबसे सरल उदाहरण के रूप में उपयोग करते हैं ।
जब तुम करोगे:
vector<Foo> vec;
// Allocate memory for a thousand Foos:
vec.reserve(1000);
... कि वास्तव में एक हजार Foos का निर्माण नहीं करता है। यह बस उनके लिए मेमोरी आवंटित / आरक्षित करता है। यदि vector
यहां प्लेसमेंट नए का उपयोग नहीं किया गया है, तो यह Foos
पूरे स्थान पर डिफ़ॉल्ट-निर्माण करने के साथ -साथ उन तत्वों को भी नष्ट करने के लिए होगा, जिन्हें आपने पहले कभी नहीं डाला था।
आवंटन! = निर्माण, मुक्त! = विनाश
आम तौर पर ऊपर की तरह कई डेटा संरचनाओं को लागू करने के लिए बोलना, आप मेमोरी को आवंटित करने और तत्वों को एक अविभाज्य चीज़ के रूप में आवंटित करने का इलाज नहीं कर सकते हैं, और आप इसी तरह स्मृति को नष्ट करने और तत्वों को एक अविभाज्य चीज़ के रूप में नष्ट करने का इलाज नहीं कर सकते हैं।
अनावश्यक रूप से बाएं और दाएं जाने वाले निर्माणकर्ताओं और विध्वंसकों से बचने के लिए इन विचारों के बीच एक अलगाव होना चाहिए, और यही कारण है कि मानक पुस्तकालय विचार को अलग std::allocator
करता है (जो तत्वों का निर्माण या विनाश नहीं करता है जब यह स्मृति को आवंटित / मुक्त करता है *)। कंटेनर जो इसका उपयोग करते हैं जो मैन्युअल रूप से प्लेसमेंट नए का उपयोग करने वाले तत्वों का निर्माण करते हैं और मैन्युअल रूप से विनाशकों के स्पष्ट चालान का उपयोग करते हुए तत्वों को नष्ट करते हैं।
- मैं इसके डिजाइन से नफरत करता हूं,
std::allocator
लेकिन यह एक अलग विषय है जिसके बारे में मैं बात नहीं करूंगा। :-D
इसलिए वैसे भी, मैं इसका बहुत उपयोग करता हूं क्योंकि मैंने कई सामान्य प्रयोजन के मानक-अनुरूप सी ++ कंटेनर लिखे हैं जो मौजूदा लोगों के संदर्भ में नहीं बनाए जा सकते हैं। उनमें शामिल है एक छोटा वेक्टर कार्यान्वयन जिसे मैंने कुछ दशकों पहले सामान्य मामलों में ढेर आवंटन से बचने के लिए बनाया था, और एक मेमोरी-कुशल ट्राई (एक बार में एक नोड आवंटित नहीं करता है)। दोनों ही मामलों में मैं वास्तव में मौजूदा कंटेनरों का उपयोग करके उन्हें लागू नहीं कर सकता था, और इसलिए मुझे placement new
अनावश्यक बाएँ और दाएँ चीजों पर निर्माण करने वालों और विनाशकारी से बचने के लिए उपयोग करना पड़ा ।
स्वाभाविक रूप से यदि आप कभी भी कस्टम आवंटनकर्ताओं के साथ व्यक्तिगत रूप से वस्तुओं को आवंटित करने के लिए काम करते हैं, जैसे एक मुफ्त सूची, तो आप आम तौर पर भी उपयोग करना placement new
चाहेंगे, इस तरह (मूल उदाहरण जो अपवाद-सुरक्षा या आरएआई से परेशान नहीं होता है):
Foo* foo = new(free_list.allocate()) Foo(...);
...
foo->~Foo();
free_list.free(foo);