2012-02-02 19 views
10

आईएमओ अस्थायी वस्तुओं गतिशील (ढेर) स्मृति में संग्रहीत हैं, लेकिन मुझे यकीन नहीं है। क्या आप कृपया मेरे विचारों की पुष्टि या इनकार कर सकते हैं?अस्थायी वस्तु कहां संग्रहीत की जाती है?

+0

"आईएमओ"? आपकी राय क्यों थी? क्या आपको यह मानने का नेतृत्व किया? –

उत्तर

4

यह अत्यधिक कार्यान्वयन निर्भर है, लेकिन वे शायद स्वचालित संग्रहण में रहते हैं।

ध्यान दें कि अनुकूलन के कारण दायरा प्रति-सहज हो सकता है।

निम्नलिखित:

class A 
{ 
//... 
}; 

//.... 

A foo() 
{ 
    A a; 
    return a; 
} 

यहाँ, वस्तु a जरूरी केवल समारोह की गुंजाइश के अंदर रहते हैं नहीं है, लेकिन RVO हो सकता है।

इसके अलावा, जब एक अस्थायी वस्तु के मूल्य से गुजरते समय, यह तुरंत नष्ट नहीं हो सकता है।

void foo(A a); 
//... 

foo(A()); 

यहां, अस्थायी रूप से केवल उस पंक्ति में जीवित नहीं है, लेकिन विधि के तर्क स्टैक के अंदर सीधे बनाया जा सकता है।

7

मानक उनके लिए किसी भी स्मृति क्षेत्र (ढेर/ढेर) को जरूरी नहीं है, लेकिन वे स्थानीय चर "स्वचालित भंडारण" की तरह हैं, जो अभिव्यक्ति के अंत में हैं (या जब एक रेफ-टू-बाध्य -कॉन्स्ट) वे नष्ट हो गए हैं।

अधिकांश कार्यान्वयन उन्हें स्थानीय चर की तरह ढेर पर स्टोर करेंगे।

संपादित करें:

के रूप में जेम्स Kanze ने कहा: मामले में एक अस्थायी के जीवनकाल एक रेफरी करने वाली स्थिरांक के माध्यम से बढ़ाया है, अपने स्टोर स्थान अधिकांश प्रयोगों कुछ हद तक के भंडारण के स्थान द्वारा निर्धारित किया जाता है पर वह संदर्भ। यही है, संदर्भ स्थिर भंडारण में होने के मामले में, अस्थायी भी होगा (केवल जीसीसी पर पुष्टि की गई)। (हालांकि आईएमएचओ हालांकि यह मानक मानकों में अभी भी अस्थायी है, यह तर्कसंगत है कि क्या यह उस शब्द की अंतर्ज्ञानी अंग्रेजी भावना में अस्थायी है)

+0

-1 और मैं समझाऊंगा क्यों। दायरे को संदर्भ के अंत तक नहीं होने पर भी अभिव्यक्ति का अंत आवश्यक नहीं है, लेकिन यह अनुकूलन के कारण और भी आगे बढ़ सकता है। मेरा जवाब देखें –

+0

@ लचियनग्रिगोर: तो आपके उदाहरण में, अस्थायी 'foo();' लौटाए जाने के बाद मौजूद होगा? क्या आप उस मानक से उद्धरण दे सकते हैं जहां इसे होने की अनुमति है? – PlasmaHH

+0

@ लचियन ग्रिगोर यहां http://stackoverflow.com/questions/9018778/will- समकालीन-object-be-deleted-if-there-is-no-const-reference-to-it कहता है कि यह अंत होना चाहिए अभिव्यक्ति, है ना? –

0

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

5

यह उनके जीवनकाल पर निर्भर करता है। आप जिन फ़ैमिलीज को एक ऐसे फ़ंक्शन के अंदर बनाते हैं जो आप अपने जीवनकाल को बढ़ाने के लिए स्थानीय स्थैतिक संदर्भ से बंधे नहीं हैं, तो संभवतः ढेर पर बनाया जाएगा। आप स्थानीय स्थैतिक संदर्भों से जुड़े अस्थायी रूप से आपके कार्यक्रम बाइनरी के .डेटा अनुभाग में संग्रहीत किए जाएंगे। अस्थायी संदर्भों से बंधे अस्थायी लोगों के लिए वही है। एक गैर-आवृत्ति चर के प्रारंभ के दौरान बनाए गए टेम्पोरर्स अन्य जो किसी संदर्भ द्वारा बाध्य होते हैं, उस फ़ंक्शन के ढेर पर होना चाहिए जो उस nonlocal चर के मान उत्पन्न करता है।

अपवाद के दौरान फेंकने वाली वस्तु का प्रतिनिधित्व करने वाली अपवाद वस्तुएं भी अस्थायी हैं। वे आमतौर पर ढेर पर रहते हैं।

+0

ध्यान दिया जाना चाहिए कि मेरा जवाब थ्रेड स्थानीय चर की उपस्थिति को अनदेखा करता है। उस व्यक्ति के साथ अनुभव किया जाना चाहिए और स्पष्टीकरण देना चाहिए। –

+0

वास्तव में, जबकि ओपी शायद उन्हें दिमाग में नहीं था, अपवाद भी अस्थायी हैं। सी ++ 11 में इंटियालाइज़र सूचियों के साथ-साथ। थ्रेड स्थानीय चर के लिए, कम से कम x86_64/linux पर वे जीएस सेगमेंट रजिस्टर की मदद से एक्सेस किए गए एक विशेष मेमोरी सेगमेंट में संग्रहीत किए जाएंगे, जो प्रत्येक थ्रेड के लिए अलग-अलग सेट है। – PlasmaHH

+0

अपवाद वस्तुओं अस्थायी हैं? या पूरी तरह से कुछ और। ( §3.7 में, मानक चार "भंडारण अवधि" सूचीबद्ध करता है: स्थैतिक, धागा, स्वचालित और गतिशील। मैंने अक्सर इसके बारे में सोचा है: अस्थायी वस्तुओं के रूप में अस्थायी स्पष्ट रूप से एक अलग अवधि है।) –

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