मेरे विशिष्ट प्रश्न है कि जब सी ++ में एक singleton class को लागू करने, वहाँ है प्रदर्शन, पक्ष मुद्दों या कुछ और के बारे में कोड नीचे दोनों के बीच कोई बड़ा मतभेद:ढेर/बनाम सी ++ सिंगलटन वर्ग उदाहरण के लिए स्थिर स्मृति आवंटन गतिशील
class singleton
{
// ...
static singleton& getInstance()
{
// allocating on heap
static singleton* pInstance = new singleton();
return *pInstance;
}
// ...
};
और इस:
class singleton
{
// ...
static singleton& getInstance()
{
// using static variable
static singleton instance;
return instance;
}
// ...
};
(ध्यान दें कि ढेर आधारित कार्यान्वयन में अपसंदर्भन प्रदर्शन प्रभावित नहीं होना चाहिए, AFAIK के रूप में वहाँ कोई अतिरिक्त मशीन कोड जेनरेट किया गया है dereferencing के लिए। यह वाक्य रचना का केवल एक मामला संकेत से अलग करने लगता है)
अद्यतन:।
मैं दिलचस्प जवाब और टिप्पणियों जो मैं उन्हें यहाँ संक्षेप में प्रस्तुत करने की कोशिश मिल गया है। (विस्तृत जवाब पढ़ना रुचि रखने वालों के लिए सिफारिश की है।):
- सिंगलटन स्थिर स्थानीय चर का उपयोग कर में, वर्ग नाशक स्वचालित रूप से प्रक्रिया समाप्ति पर शुरू हो जाती है, गतिशील आवंटन मामले में, आप है, जबकि कुछ समय पर वस्तु विनाश का प्रबंधन करने के लिए, उदाहरण के लिए स्मार्ट संकेत का उपयोग करके:
static singleton& getInstance() {
static std::auto_ptr<singleton> instance (new singleton());
return *instance.get();
}
सिंगलटन गतिशील आवंटन का उपयोग कर ("lazier" स्थिर सिंगलटन चर से, बाद में मामले में है, सिंगलटन वस्तु के लिए आवश्यक स्मृति है हमेशा ?) प्रक्रिया स्टार्ट-अप पर आरक्षित (प्रोग्राम लोड करने के लिए आवश्यक पूरी मेमोरी के हिस्से के रूप में) और केवल सिंगलटन कन्स्ट्रक्टर को कॉल करने के लिए
getInstance()
कॉल-टाइम पर स्थगित कर दिया गया है। इससे कोई फर्क नहीं पड़ता किsizeof(singleton)
बड़ा है।दोनों सी ++ 11 में थ्रेड-सुरक्षित हैं। लेकिन सी ++ के पुराने संस्करणों के साथ, यह कार्यान्वयन-विशिष्ट है।
गतिशील आवंटन मामले जबकि स्थिर सिंगलटन वस्तु मामले में, वस्तु के प्रत्यक्ष पता निर्धारित किया जाता है और संकलन समय पर हार्ड कोड किए गए सिंगलटन वस्तु का उपयोग करने के अविवेक से एक स्तर का उपयोग करता है।
पी.एस .: मैं शब्दावली मैं मूल पोस्टिंग में @ TonyD के जवाब के अनुसार इस्तेमाल किया था को सही है।
आप दो के लिए उत्पन्न विधानसभा की तुलना में है? –
नहीं। यदि आप दो अलग-अलग कार्यान्वयन के लिए जेनरेटेड असेंबली का मतलब रखते हैं, तो वे स्पष्ट रूप से अलग हैं, क्योंकि एक ढेर पर आवंटित होता है और कोई लोड/कॉल टाइम प्रारंभ करता है। यदि आपका मतलब है कि डिफ्रेंसिंग के लिए जेनरेटेड असेंबली, नहीं, तो मैंने तुलना नहीं की है। मुझे बस ऐसा लगता है। –