सी ++ प्रोग्रामर को ढेर या ढेर पर ऑब्जेक्ट आवंटित करने का विकल्प प्रदान करता है।
स्टैक-आधारित आवंटन more efficient है: आवंटन सस्ता है, डीलोकेशन लागत वास्तव में शून्य है, और भाषा ऑब्जेक्ट लाइफसाइक्सेस को कम करने में सहायता प्रदान करती है, जिससे ऑब्जेक्ट को मुक्त करने के जोखिम को कम किया जाता है।
दूसरी तरफ, सी ++ में, आपको स्टैक-आधारित ऑब्जेक्ट्स के संदर्भों को प्रकाशित या साझा करते समय बहुत सावधान रहना होगा क्योंकि स्टैक-फ्रेम ऑब्जेक्ट स्वचालित रूप से मुक्त हो जाते हैं जब स्टैक फ्रेम अवांछित होता है, जिससे लटकने वाले पॉइंटर्स होते हैं।
new
ऑपरेटर के साथ, सभी ऑब्जेक्ट्स जावा या सी # में ढेर पर आवंटित किए जाते हैं।
कक्षा 1 ओबीजे = कक्षा 1();
वास्तव में, संकलक एक विधि Class1()
बुलाया खोजने की कोशिश करेंगे।
उदा।
public class MyClass
{
//Oops, this has a return type, so its a method not a constructor!
//Because no constructor is defined, Java will add a default one.
//init() will not get called if you do new MyClass();
public void MyClass()
{
init();
}
public void init()
{
...
}
}
नोट:: निम्नलिखित एक आम जावा बग है "सभी वस्तुओं ढेर पर आवंटित किए जाते हैं" मतलब यह नहीं है ढेर आवंटन कभी कभी हुड के नीचे किया जाता है।
उदाहरण के लिए, जावा में, escape analysis जैसे हॉटस्पॉट अनुकूलन स्टैक आवंटन का उपयोग करता है।
रनटाइम कंपाइलर द्वारा किया गया यह विश्लेषण उदाहरण के लिए निष्कर्ष निकाला जा सकता है कि ढेर पर एक वस्तु को केवल विधि में स्थानीय रूप से संदर्भित किया जाता है और कोई भी संदर्भ इस दायरे से बच नहीं सकता है। यदि ऐसा है, तो हॉटस्पॉट रनटाइम अनुकूलन लागू कर सकता है। यह वस्तु को ढेर पर या ढेर के बजाय रजिस्टरों में आवंटित कर सकता है।
इस तरह के अनुकूलन हालांकि AFAIK ऊपर टिप्पणियों वे जल्दी ड्राफ्ट में जावा 7 के लिए नए कीवर्ड दूर करने के लिए योजना बना रहे थे के अलावा considereddecisive ...
मुझे वास्तव में आपका दूसरा बिंदु पसंद है। – dalle
दूसरे बिंदु पर: आप वैसे भी ऐसा कर सकते हैं, लेकिन इसे इसके साथ अर्हता प्राप्त करनी थी। क्लास 1()। वही बात तब होती है जब प्रकार और सदस्य नाम टकराते हैं। –
यह सच है, लेकिन आपके पास पठनीयता समस्याएं हो सकती हैं। – Paco