2010-04-07 5 views
7

के साथ आवंटित वस्तुओं के लिए कन्स्ट्रक्टर तर्कों को पारित करना यह एक शर्मनाक सवाल है, लेकिन boost.interprocess के साथ प्रदान किए गए अच्छी तरह से लिखित दस्तावेज भी मेरे लिए पर्याप्त नहीं है यह करने के लिए।सी ++ आवंटकों, विशेष रूप से बूस्ट :: इंटरप्रोसेस :: cached_adaptive_pool

क्या मैं एक cached_adaptive_pool संभाजक उदाहरण है, और मैं निर्माता मानकों के साथ गुजर इसका इस्तेमाल करने के लिए एक वस्तु का निर्माण करना चाहते हैं,:

struct Test { 
    Test(float argument, bool flag); 
    Test(); 
}; 

// Normal construction 
Test obj(10, true); 
// Normal dynamic allocation 
Test* obj2 = new Test(20, false); 

typedef managed_unique_ptr< 
    Test, boost::interprocess::managed_shared_memory>::type unique_ptr; 

// Dynamic allocation where allocator_instance == cached_adaptive_pool, 
// using the default constructor 
unique_ptr obj3 = allocator_instance.allocate_one() 
// As above, but with the non-default constructor 
unique_ptr obj4 = allocator_instance ... ??? 

यह बहुत अच्छी तरह से उपयोग के बारे में मेरी ओर से एक विफलता हो सकता है सामान्य रूप से आवंटक वस्तुओं। लेकिन किसी भी मामले में, मैं इस ऑब्जेक्ट को कन्स्ट्रक्टर तर्क पास करने के लिए cached_adaptive_pool में निर्दिष्ट इंटरफ़ेस के साथ इस विशिष्ट आवंटक का उपयोग कैसे नहीं कर सकता।

cached_adaptive_pool में विधि है: void construct(const pointer & ptr, const_reference v) लेकिन मुझे समझ में नहीं आता कि इसका क्या अर्थ है और मुझे इसका उपयोग उदाहरण नहीं मिल रहा है।

मेरा सिर पूरे दिन टेम्पलेट्स में तैर रहा है, इसलिए मदद करने वाला हाथ, भले ही उत्तर स्पष्ट है, की सराहना की जाएगी।

उत्तर

1

cached_adaptive_pool विधि है: शून्य निर्माण (स्थिरांक सूचक & ptr, const_reference v) लेकिन मैं क्या है कि इसका मतलब है समझ में नहीं करते हैं और मैं उदाहरण इसे प्रयोग नहीं पा सकते हैं।

यह std::allocator के इंटरफेस, जिस स्थिति में allocate() आप अप्रारंभीकृत स्मृति और construct() कॉल प्लेसमेंट दी जाती सूचक पर नए का एक उपयुक्त हिस्सा देता है का पालन करना चाहिए।

कुछ की तरह:

allocator_instance.construct(allocator_instance.allocate_one(), Test(30, true)); 

उन पूल अपने आप को हालांकि उपयोग नहीं किया है,। सी ++ 0x में, आवंटक किसी भी कन्स्ट्रक्टर को कॉल करने में सक्षम होना चाहिए, न केवल कॉपी कन्स्ट्रक्टर, इसलिए हो सकता है कि बूस्ट के आवंटक पहले से ही इस हद तक इसका समर्थन कर सकें।

a.construct(p, 30, true); //a C++0x allocator would allow this and call new (p) Test(30, true) 
+0

धन्यवाद। पहला रूप मुझे जिस प्रकार का उत्तर था, वह बहुत ही उलझन में था और खुद को महसूस करने के लिए थक गया था। दूसरा फॉर्म 'a.construct (पी, 30, सत्य) 'इस विशिष्ट बूस्ट आवंटक द्वारा समर्थित नहीं प्रतीत होता है। कष्टप्रद पर्याप्त है, क्योंकि 'cached_adaptive_pool.construct() 'रिटर्न' शून्य 'है, मुझे' allocator_t :: पॉइंटर obj = allocator.allocate_one() लिखना है; allocator.construct (obj, टेस्ट (30, सच)) '? मुझे यकीन नहीं है कि क्या एक बुरा ऑपरेशन के लिए दो बयानों का उपयोग करके या कुछ हद तक अजीब लग रही प्लेसमेंट का उपयोग करके और भी बदतर है। – porgarmingduod

+0

आप इसे एक अलग कार्य कर सकते हैं। – UncleBens

1

मुझे लगता है कि मैं हमेशा प्लेसमेंट नया वाक्यविन्यास का उपयोग कर सकता हूं। विचार आवंटक द्वारा लौटाए गए स्मार्ट पॉइंटर (इस मामले में ऑफसेट_पीटीआर) को हटाना है, और फिर कच्चे पते को नए() पर पास करना है।

unique_ptr obj = new(&(*allocator_instance.allocate_one())) Test(1,true) 

क्या यह ऐसा करने का बेवकूफ तरीका है? बूस्ट में ऐसे कई अन्य स्थान हैं जहां नियुक्ति नया उपयोग करने से बचने के लिए स्पष्ट समर्थन प्रदान किया जाता है, जो मुझे नहीं सोचता है। किसी भी मामले में, अगर मैं निकट भविष्य में कुछ भी बेहतर नहीं प्रदान करता हूं तो मैं इस जवाब को स्वीकार करूंगा।

+0

'& * ptr' अनुक्रम क्या है? – UncleBens

+0

जब मैंने इसका परीक्षण किया, तो नया केवल कच्चे सूचक को स्वीकार करेगा, न कि ऑफ़सेट_प्टआर जो ये आवंटक लौटाता है। – porgarmingduod