2010-11-05 8 views
5

मुझे std :: ऑब्जेक्ट्स (विशेष रूप से और प्रारंभ में std :: वेक्टर के लिए) के लिए एक कस्टम आवंटक बनाने की आवश्यकता है, लेकिन अंततः यह अन्य लोगों का उपयोग करने के लिए आ सकता हैसबसे खराब हो सकता है अगर मैं स्टेटलेस कस्टम आवंटकों का पालन नहीं करता?

मुझे एक कस्टम आवंटक बनाने की आवश्यकता है कि मुझे इसकी आवश्यकता है आवंटित ट्रैक (ढेर & स्टैक) अनुप्रयोग के व्यक्तिगत घटकों द्वारा संसाधन (यह एप्लिकेशन की एक अंतर्निहित विशेषता है)। मैं संसाधनों का ढेर भाग नजर रखने के लिए कस्टम संभाजक की आवश्यकता होगी, इसलिए यह जरूरी है कि मैं एसटीडी करने के लिए पारित करने में सक्षम हूँ ::

trackerId idToTrackUsage; 
myAlloca<int> allocator(idToTrackUsage); 
vector<int> Foo(allocator); 
हालांकि

, जैसे वेक्टर निर्माता कुछ एक सा मैंने पाया पढ़ने के बाद एसटीएल/सी ++ मानक (संदर्भ देखें) के बारे में यह छोटा बम कह रहा है कि किसी दिए गए प्रकार के सभी आवंटन उदाहरण बराबर होना चाहिए (यानी == किसी भी दो उदाहरणों के लिए सच होना चाहिए), और अधिकांश टर्मिनल; किसी भी आवंटक को किसी भी अन्य उदाहरण द्वारा आवंटित स्मृति को रद्द करने में सक्षम होना चाहिए (यानी, यह जानने के बिना कि वह अन्य उदाहरण क्या हो सकता है)। संक्षेप में, आवंटकों के पास राज्य नहीं हो सकता है।

तो मैं इस के आसपास सबसे अच्छा तरीका खोजने की कोशिश कर रहा हूं। कोई चालाक विचार? मैं वास्तव में वास्तव में वास्तव में std :: वेक्टर के कस्टम संस्करण को रखना नहीं चाहता हूं।

संपादित करें: मैंने http://www2.research.att.com/~bs/C++0xFAQ.html#scoped-allocator पर सी ++ 0x के लिए स्कॉप्ड आवंटकों के बारे में पढ़ा है, लेकिन मैं वास्तव में यह समझने में असमर्थ नहीं था कि यह मेरी समस्या पर कैसे लागू होता है। किसी को भी सोचता है तो सी ++ 0x दूर इस समस्या, टिप्पणी कृपया

संदर्भ:

Allocator C++ article in Wikipedia

Some random further reading courtesy of Google

+1

वैसे, कुछ हद तक संबंधित है, लेकिन मुझे लगता है कि सी ++ 0x में आवंटक मॉडल में महत्वपूर्ण बदलाव होने लगते हैं। इसके बारे में क्या कोई कुछ जानता है? (या संकल्पनाओं को हटाने से पहले ही यह था?) – jalf

+1

मैंने इसके बारे में http://www2.research.att.com/~bs/C++0xFAQ.html#scoped-allocator पर पढ़ा लेकिन मैं वास्तव में दूर नहीं जा सका यह समझने में कि यह मेरी समस्या पर कैसे लागू होता है। (इस के साथ पोस्ट अपडेट करेगा) – lurscher

उत्तर

5

स्पष्ट जवाब के अलावा ("अगर आप किसी भी आवश्यकता का उल्लंघन, कि अपरिभाषित व्यवहार, अच्छा रात और खेलने के लिए धन्यवाद है"), मैं सबसे खराब संभावना है कि क्या होगा कल्पना, यह है कि vector कार्यान्वयन पर भरोसा कर सकते आवश्यकता है कि स्पष्ट रास्ते में "संभाजक वर्ग के सभी उदाहरणों परस्पर विनिमय कर रहे":

vector(const Allocator &youralloc = Allocator()) { 
    const Allocator hawhaw; 
    // use hawhaw and ignore youralloc. 
    // They're interchangeable, remember? 
} 

स्रोत को देखते हुए, जीसीसी के वेक्टर कार्यान्वयन (जो मुझे लगता है कि SGI की मूल एसटीएल कार्यान्वयन पर अंत में आधारित है) की दुकान प्रकार के- करता है उस कन्स्ट्रक्टर में आवंटित आवंटक वस्तु की एक प्रति, इसलिए कुछ उम्मीद है कि ऐसा नहीं होगा।

मैं कहूंगा कि आप इसे आजमाएं और देखें और दस्तावेज जो आपने किया है बहुत सावधानी से, ताकि कोई भी आपके द्वारा उपयोग किए गए कार्यान्वयन पर आपके कोड का उपयोग करने का प्रयास कर रहा हो, जानता है कि क्या हो रहा है। कार्यान्वयनकर्ताओं को आवंटकों पर प्रतिबंधों को आराम करने के लिए मानक में प्रोत्साहित किया जाता है, इसलिए यह एक गंदे चाल होगी कि ऐसा लगता है कि वास्तव में वे आराम नहीं कर रहे हैं। इसका मतलब यह नहीं होगा कि ऐसा नहीं होगा।

यदि आप वास्तव में भाग्यशाली हैं, तो आपके कंटेनर कार्यान्वयन के लिए कुछ दस्तावेज हैं जो आवंटकों के बारे में बात करते हैं।

+0

मैंने आवंटक को राज्य जोड़ा और सुनिश्चित किया कि == और! = राज्य के आधार पर सही जांच लौटाएं, इसलिए अगर यह कहीं भी std sourcecode की विशालता में जोर दे, यह असफल होना चाहिए। मैंने आधे महीने तक परीक्षण किया है और ऐसा लगता है कि यह जोर नहीं देता है या इसके लिए जांच करने की ज़रूरत नहीं है, और यह अब तक बहुत अच्छा काम कर रहा है, ** कम से कम std :: vector ** – lurscher

+1

@lurscher के साथ: इसका परीक्षण करें 'सूची' और 'मानचित्र' के साथ। जो 'ऑलोकेटर ' पैरामीटर लेता है, लेकिन नीचे 'आवंटित ' का उपयोग करें। अगर यह उसके साथ काम करता है, तो आप शायद ठीक हैं। –

3

आप, ज़ाहिर है, जो कुछ राज्य तो आप किसी भी आवंटित में जरूरत के लिए एक सूचक छोड़ सकता ब्लॉक। इसका मतलब यह है कि किसी भी ब्लॉक-ब्लॉक स्थिति को उस ब्लॉक में संग्रहीत किया जाना चाहिए, और आवंटक उदाहरण वास्तविक वस्तुओं की तुलना में हैंडल की तरह अधिक कार्य करेंगे।

+1

यह एक दिलचस्प संभावना है – lurscher

1

आवंटक राज्य स्थैतिक बनाना चाल चलाना होगा, अगर आप इसके साथ काम करने में सक्षम हैं।इसका मतलब यह है कि प्रकार के सभी आवंटकों को अपने राज्य को साझा करना होगा, लेकिन आपकी आवश्यकताओं से, ऐसा लगता है कि यह स्वीकार्य हो सकता है

+0

अलग-अलग घटकों के लिए वास्तव में अलग-अलग आवंटकों में (मेरे उदाहरण कोड का उपयोग करके) अलग ट्रैकर आईडी होगा, इसलिए मूल रूप से मैं ऐसा करने में सक्षम हूं: घटक ए, ढेर का 15%, घटक बी, 67% ढेर, आदि – lurscher

+0

@ लांचर: और आप प्रत्येक घटक के लिए एक अलग आवंटक का उपयोग करके ऐसा नहीं कर सकते हैं? – jalf

+0

@lurcsher यदि आपको अलग-अलग आवंटकों की आवश्यकता है तो भी आप स्थिर स्थिति का उपयोग कर सकते हैं लेकिन आवंटक को एक टेम्पलेट क्लास है जिसमें एक अद्वितीय पैरामीटर है ताकि आपके पास वास्तव में सभी प्रकार के लिए अलग-अलग प्रकार और अलग-अलग स्थिर डेटा हो। – Motti

1

आपके संपादन का जवाब देने के लिए: हाँ, सी ++ 0x या सी + में +11, आवंटकों के पास राज्य हो सकता है।

संबंधित मुद्दे