[C++] सी ++ का निर्माण "प्लेसमेंट न्यू" का क्या उपयोग है?


Answers

यह एम्बेडेड प्रोग्रामिंग के लिए भी उपयोग किया जाता है, जहां आईओ डिवाइसेस को अक्सर विशिष्ट मेमोरी पतों के लिए मैप किया जाता है

Question

मैं बस सी ++ निर्माण के बारे में सीखा है जिसे "प्लेसमेंट न्यू" कहा जाता है यह आपको पूरी तरह से नियंत्रित करने की अनुमति देता है जहां एक पॉइंटर स्मृति में इंगित करता है। यह इस तरह दिख रहा है:

 #include <new>        // Must #include this to use "placement new"
 #include "Fred.h"     // Declaration of class Fred

 void someCode()
 {
   char memory[sizeof(Fred)];
   void* place = memory;

   Fred* f = new(place) Fred();   // Create a pointer to a Fred(),
                                  // stored at "place"

   // The pointers f and place will be equal

   ...
 } 

( सी ++ FAQ लाइट से उदाहरण)

इस उदाहरण में, फ्रेड का this सूचक place बराबर होगा।

मैंने देखा है कि यह हमारी टीम के कोड में एक या दो बार इस्तेमाल किया। आपके अनुभव में, यह किस प्रकार सक्षम बनाता है? क्या अन्य सूचक भाषाओं में समान संरचनाएं हैं? मेरे लिए, यह फोरट्रान में equivalence याद दिलाता है, जो भिन्न चर को स्मृति में एक ही स्थान पर कब्जा करने की अनुमति देता है।




वस्तुओं की तरह अपने स्वयं के कंटेनर का निर्माण करते समय इसकी उपयोगी

उदाहरण के लिए यदि आप एक वेक्टर बनाने के लिए थे यदि आप बड़े ऑब्जेक्ट के लिए स्पेस आरक्षित करते हैं, तो आप किसी मेथड के साथ मेमोरी आवंटित करना चाहते हैं, जो ऑब्जेक्ट के कन्स्ट्रक्टर को नहीं लाते हैं (जैसे कि नए चार्ज [आकार (ऑब्जेक्ट) * आरक्षित आकार))। तब जब लोग सदिश में ऑब्जेक्ट जोड़ना शुरू करते हैं तो आप इन्हें आवंटित मेमोरी में कॉपी करने के लिए प्लेसमेंट नई का उपयोग करते हैं।

template<typename T>
class SillyVectorExample
{
    public:
        SillyVectorExample()
            :reserved(10)
            ,size(0)
            ,data(new char[sizeof(T) * reserved])
        {}
        void push_back(T const& object)
        {
            if (size >= reserved)
            {
                // Do Somthing.
            }
            // Place a copy of the object into the data store.
            new (data+(sizeof(T)*size))  T(object);
            ++size;
        }
        // Add other methods to make sure data is copied and dealllocated correctly.
    private:
        size_t   reserved;
        size_t   size;
        char*    data;
 };

पुनश्च। मैं यह करने की वकालत नहीं कर रहा हूं। यह सिर्फ एक आसान उदाहरण है कि कैसे कंटेनर काम कर सकता है




मैं कर्नेल मोड में C ++ करते समय इस निर्माण का उपयोग करता हूं।

मैं कर्नेल मोड मेमोरी आवंटन का उपयोग करता हूं और आवंटित खंड पर ऑब्जेक्ट का निर्माण करता हूं।

यह सब कक्षाओं और कार्यों में लिपटे हुए हैं, लेकिन अंत में मैं प्लेसमेंट नई करता हूं।




सटीक प्लेसमेंट को नियंत्रित करके, आप चीजों को स्मृति में संरेखित कर सकते हैं और कभी-कभी CPU फ़ेच / कैश प्रदर्शन सुधारने के लिए इसका उपयोग किया जा सकता है। वास्तव में कभी भी इसे उपयोग में नहीं देखा, हालांकि




प्लेसमेंट नए डेवलपर को स्मृति को आवंटित स्मृति खंड से आवंटित करने की अनुमति देता है। यदि सिस्टम बड़ा है, तो डेवलपर्स प्लेसमेंट नई का उपयोग करने के लिए जाते हैं अब मैं एक बड़ा एविऑनिक्स सॉफ़्टवेयर पर काम कर रहा हूं वहां हम बड़ी मेमोरी आवंटित करते हैं जो कि शुरूआत में आवेदन के निष्पादन के लिए जरूरी है। और जहां कहीं भी आवश्यक स्मृति आवंटित करने के लिए हम प्लेसमेंट नई का उपयोग करते हैं यह प्रदर्शन को कुछ राशि में बढ़ाता है




मैंने इसका उपयोग नेटवर्क से प्राप्त संदेश युक्त स्मृति के आधार पर ऑब्जेक्ट बनाने के लिए किया है।