यह अन्य उत्तरों की तुलना में अधिक सूक्ष्म है। ढेर पर डेटा और ढेर पर डेटा के बीच कोई पूर्ण विभाजन नहीं है, आप इसे कैसे घोषित करते हैं, इसके आधार पर। उदाहरण के लिए:
std::vector<int> v(10);
एक फ़ंक्शन के शरीर में, जो vector
स्टैक पर दस पूर्णांक के (गतिशील सरणी) की घोषणा करता है । लेकिन संग्रहण द्वारा प्रबंधित संग्रहण vector
स्टैक पर नहीं है।
आह, लेकिन (अन्य उत्तर सुझाते हैं) उस भंडारण का जीवनकाल vector
स्वयं के जीवनकाल से होता है, जो यहां स्टैक-आधारित है, इसलिए इससे कोई फर्क नहीं पड़ता कि इसे कैसे लागू किया जाता है - हम इसे केवल स्टैक-आधारित ऑब्जेक्ट के रूप में मान सकते हैं मूल्य शब्दार्थ के साथ।
ऐसा नहीं। मान लीजिए कि समारोह था:
void GetSomeNumbers(std::vector<int> &result)
{
std::vector<int> v(10);
// fill v with numbers
result.swap(v);
}
तो एक swap
फ़ंक्शन के साथ कुछ भी (और किसी भी जटिल मूल्य प्रकार के पास एक होना चाहिए) कुछ हीप डेटा के लिए एक तरह के विद्रोही संदर्भ के रूप में काम कर सकता है, एक प्रणाली के तहत जो उस डेटा के एकल स्वामी की गारंटी देता है।
इसलिए आधुनिक सी ++ दृष्टिकोण नग्न स्थानीय सूचक चर में ढेर डेटा के पते को कभी भी संग्रहीत नहीं करना है । सभी ढेर आवंटन कक्षाओं के अंदर छिपे होने चाहिए।
यदि आप ऐसा करते हैं, तो आप अपने कार्यक्रम के सभी चर के बारे में सोच सकते हैं जैसे कि वे सरल मूल्य प्रकार थे, और पूरी तरह से हीप के बारे में भूल जाते हैं (कुछ हीप डेटा के लिए एक नया मूल्य-जैसे आवरण वर्ग लिखने के अलावा, जो असामान्य होना चाहिए) ।
आपको अनुकूलन करने में मदद करने के लिए केवल एक विशेष ज्ञान को बनाए रखना होगा: जहां संभव हो, इसके बजाय एक चर को दूसरे को सौंपने के बजाय:
a = b;
उन्हें इस तरह स्वैप करें:
a.swap(b);
क्योंकि यह बहुत तेज़ है और यह अपवाद नहीं फेंकता है। केवल आवश्यकता यह है कि आपको b
उसी मूल्य को जारी रखने की आवश्यकता नहीं है (यह a
बदले में मूल्य प्राप्त करने जा रहा है , जो कि ट्रैश हो जाएगा a = b
)।
नकारात्मक पक्ष यह है कि यह दृष्टिकोण आपको वास्तविक रिटर्न मान के बजाय आउटपुट मापदंडों के माध्यम से कार्यों से मान वापस करने के लिए मजबूर करता है। लेकिन वे इसे C ++ 0x में रैवल्यू रेफरेंस के साथ ठीक कर रहे हैं ।
सभी की सबसे जटिल स्थितियों में, आप इस विचार को सामान्य चरम पर ले जाएंगे और एक स्मार्ट पॉइंटर क्लास का उपयोग करेंगे जैसे कि shared_ptr
पहले से ही tr1 में है। (हालांकि मैं तर्क दूंगा कि यदि आपको इसकी आवश्यकता प्रतीत होती है, तो आप संभवतः मानक C ++ की प्रयोज्यता के मधुर स्थान से बाहर चले गए हैं।)