2010-07-11 26 views
5

तो मैं पीआईएमपीएल और आवंटन ढेर के बारे में सोच रहा हूं। मैं एक पुस्तकालय लिख रहा हूं और कक्षा के निजी सदस्य को छिपाने के लिए पीआईएमपीएल का उपयोग करने का फैसला किया। इसका मतलब है कि मेरे पास इसपीआईएमपीएल और स्टैक आवंटन

class Foo { 
private: 
    class Handle; 
    std::tr1::shared_ptr<Handle> handle; 
public: 
    Foo(); 
}; 

की तरह घोषित कक्षा होगी, यह बहुत सीधी आगे है। लेकिन फिर निर्माता में आप इस

Foo::Foo() : handle(new Handle()) {} 

तो जब मेरे पुस्तकालय का उपयोग कर किसी स्टैक पर एक फू बनाता है, वे अनिवार्य रूप से एक ढेर आवंटन वैसे भी कर रहे हैं है। क्या यह व्यापार-बंद है जिसे आप पीआईएमपीएल का उपयोग करते समय जीते हैं? मैंने प्रलेखकों के बगल में एक चेतावनी के साथ दस्तावेज़ीकरण जारी करने का विचार किया: "चेतावनी: यह एक ढेर आवंटन में परिणाम" या somesuch।

मेरा दूसरा विचार था कि सभी वर्गों को शुद्ध वर्चुअल इंटरफेस और स्मार्ट पॉइंटर्स लौटने वाले स्थैतिक फैक्ट्री विधियों के पूरे समूह के रूप में कार्यान्वित किया गया हो। इसका मतलब ढेर आवंटन भी है लेकिन इसमें कोई चाल नहीं है।

कोई विचार या सुझाव? क्या मैं अपनी लाइब्रेरी का उपयोग कर प्रोग्रामर के अत्यधिक विचारशील हूं?

+1

ऐसी चेतावनी के साथ समस्या यह है कि बड़ी संख्या में संचालन के परिणामस्वरूप ढेर आवंटन होते हैं। 'Std :: vector' बनाना भी यह करता है। या एक का आकार बदलना। ट्रेडऑफ यह है कि कक्षा के आंतरिक भाग को छिपाना कितना महत्वपूर्ण है, बनाम हेप आवंटन से बचने के अतिरिक्त प्रदर्शन। – jalf

उत्तर

4

क्या यह व्यापार बंद है जिसे आप पीआईएमपीएल का उपयोग करते समय जीना चाहते हैं?

प्रभावी ढंग से, हाँ, हालांकि ऐसी है कि खत्म करने या ढेर आवंटन में तेजी लाने के, अधिक से अधिक जटिलता की कीमत पर इस्तेमाल किया जा सकता "The Fast Pimpl Idiom," में हर्ब Sutter द्वारा चर्चा उन लोगों के रूप तकनीक, कर रहे हैं।

मैंने प्रलेखकों के बगल में एक चेतावनी के साथ दस्तावेज़ीकरण जारी करने के बारे में सोचा: "चेतावनी: इसका परिणाम एक ढेर आवंटन में होता है" या somesuch।

केवल अगर ऐसा करना आवश्यक है (यानी, केवल तभी जब आपके उपयोगकर्ता इस तथ्य से हैरान होंगे कि आपकी कक्षा ने ढेर आवंटन किया है)। कई कक्षाएं ढेर आवंटन करती हैं, जिनमें सी ++ मानक पुस्तकालय (उदाहरण के लिए सभी कंटेनर) शामिल हैं।

क्या मैं अपनी लाइब्रेरी का उपयोग कर प्रोग्रामर के अत्यधिक विचारशील हूं?

संभावित रूप से :-)। जब तक कि आपकी कक्षा के लिए उच्च प्रदर्शन आवश्यकताएं न हों या आप अपनी कक्षा के उदाहरणों को अत्यधिक बार बनाए और नष्ट कर दें, मैं इसके बारे में ज्यादा चिंता नहीं करता। बेशक, यदि आपके पास महत्वपूर्ण प्रदर्शन आवश्यकताएं हैं, तो पिंपल एक अच्छा विकल्प नहीं हो सकता है।

+0

कूल, धन्यवाद। मैं वैसे भी फास्ट पिंपल के रूप में देखता हूं क्योंकि यह दिलचस्प लग रहा है। – Anthony

4

तो जब मेरी लाइब्रेरी का उपयोग करने वाला कोई व्यक्ति ढेर पर एक फू बनाता है, तो वे अनिवार्य रूप से एक ढेर आवंटन कर रहे हैं। क्या यह व्यापार-बंद है जिसे आप पीआईएमपीएल का उपयोग करते समय जीते हैं?

हाँ।

मैंने प्रलेखकों के बगल में एक चेतावनी के साथ दस्तावेज़ीकरण जारी करने के बारे में सोचा: "चेतावनी: इसका परिणाम एक ढेर आवंटन में होता है" या somesuch।

मैं आक्रामक टिप्पणी पर विचार करता हूं :) यदि आपकी कक्षा इतनी महत्वपूर्ण है, तो शायद आपको पीआईएमपीएल मुहावरे से बचना चाहिए।यदि आप किसी संख्या का प्रतिनिधित्व कर रहे हैं, तो यह हो सकता है कि यह ध्यान देने योग्य और ध्यान देने योग्य हो। टिप्पणी आप एक डेटाबेस कनेक्शन के कार्यान्वयन छुपा रहे हैं, नहीं लायक :)

मेरे अन्य विचार जो शुद्ध आभासी इंटरफेस के रूप में लागू करने और लौटने स्थिर कारखाने तरीकों की एक पूरी गुच्छा के संपर्क में हैं सभी वर्गों के लिए था स्मार्ट पॉइंटर्स इसका मतलब ढेर आवंटन भी है लेकिन इसमें कोई चाल नहीं है।

हाँ, यह उपयोगकर्ता के लिए थोड़ा और स्पष्ट है, लेकिन फिर शायद अपने आप से संबंधित नहीं है।

कोई विचार या सुझाव? क्या मैं अपनी लाइब्रेरी का उपयोग कर प्रोग्रामर के अत्यधिक विचारशील हूं?

एक ट्रेडऑफ है, लेकिन यदि आपकी कक्षा वास्तव में पिंपल मुहावरे से प्राप्त करने के लिए काफी जटिल है, तो शायद आप एक ढेर आवंटन ठीक कर सकते हैं। अगर मैं आपकी लाइब्रेरी का उपयोग कर रहा था, तो शायद यह मुझे चिंता नहीं करेगा।

+0

कूल, धन्यवाद। मैं सिर्फ 'मैं क्या कर रहा हूं' करना जारी रखूंगा। – Anthony

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