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