2011-11-23 12 views
16

मानें someClass कुछ विधि int doSomething(void) के साथ सी # में परिभाषित एक वर्ग है, और सादगी के लिए, कोई कन्स्ट्रक्टर कोई तर्क नहीं ले रहा है। फिर, सी # में, उदाहरणों जीसी ढेर पर बनाया जाना है:,उलझन में: उदाहरण के लिए C++

someClass c;     // legit, but only a null pointer in C# 
// c->doSomething()   // would not even compile. 
c = new someClass();   // now it points to an instance of someclass. 
int i = c->doSomething();  

अब अगर someClass कुछ नेट पुस्तकालय में संकलित किया गया है, तो आप भी C++/CLI में इसका इस्तेमाल कर सकते हैं:

someClass^ cpp_gcpointer = gcnew someClass(); 
int i = cpp_gcpointer->doSomething(); 

इतना आसान है! निफ्टी! यह निश्चित रूप से प्रोजेक्ट में .Net लाइब्रेरी का संदर्भ मान लिया गया है और घोषणा का उपयोग करके संबंधित है।

यह मेरी समझ है कि यह पिछले सी # उदाहरण के सटीक सी ++/सीएलआई समतुल्य है (एक पंक्ति में घुलनशील, यह वह बिंदु नहीं है जिसमें मुझे रूचि है)। सही बात? (क्षमा करें, मैं विषय के लिए नए हूँ)

सी ++ में, हालांकि, यह भी

someClass cpp_cauto;    // in C++ declaration implies instantiation 
int i = cpp_cauto.doSomething(); 

मान्य सिंटैक्स है। जिज्ञासा से, मैंने आज कोशिश की। मेरे कंधे पर देखकर एक सहयोगी, शर्त लगाने के लिए तैयार था कि वह संकलित भी नहीं होगा। वह शर्त खो देता। (यह अभी भी सी # असेंबली से कक्षा है)। दरअसल यह पिछले उदाहरणों के कोड के रूप में भी उसी परिणाम i का उत्पादन करता है।

निफ्टी भी, लेकिन - उहम्म - यह वास्तव में क्या है, यहां क्या बनाया गया है? मेरा पहला जंगली अनुमान था कि मेरी पीठ के पीछे, नेट गतिशील रूप से जीसी ढेर पर एक उदाहरण बनाता है और cpp_auto इस ऑब्जेक्ट के लिए किसी प्रकार का आवरण है, जो someClass वर्ग के उदाहरण की तरह वाक्य रचनात्मक रूप से व्यवहार करता है। लेकिन तब मैं इस पृष्ठ

पाया http://msdn.microsoft.com/en-us/library/ms379617%28v=vs.80%29.aspx#vs05cplus_topic2

यह पृष्ठ मुझे बताने की, कि (कम से कम, अगर SomeClass थे एक सी ++ वर्ग) cpp_auto वास्तव में ढेर, पर बनाई गई है, जो मेरी जानकारी के लिए, हो सकता है लगता है शास्त्रीय सी ++ में आपको वही व्यवहार मिलता है। और कुछ ऐसा जो आप सी # में नहीं कर सकते (आप नहीं कर सकते, क्या आप कर सकते हैं?)। मैं क्या जानना चाहता हूं: क्या सी # असेंबली का उदाहरण भी ढेर पर बनाया गया है? क्या आप सी ++ में स्टेक पर क्लास इंस्टेंस के साथ नेट बाइनरी का उत्पादन कर सकते हैं जिसे आप सी # में नहीं बना सकते हैं? और क्या यह संभवतः आपको एक परफॉर्मेंस लाभ भी दे सकता है :-)?

सधन्यवाद,

थॉमस

उत्तर

12

link you referenced विस्तार से इस बताते हैं:

C++/CLI आप संदर्भ प्रकार के साथ ढेर अर्थ विज्ञान रोजगार की अनुमति देता है। इसका अर्थ यह है कि आप स्टैक पर ऑब्जेक्ट आवंटित करने के लिए आरक्षित वाक्यविन्यास का उपयोग करके एक संदर्भ प्रकार पेश कर सकते हैं। कंपाइलर आपको उन अर्थशास्त्र प्रदान करने का ख्याल रखेगा जिन्हें आप सी ++ से उम्मीद करेंगे, और कवर के तहत वास्तव में प्रबंधित ढेर पर ऑब्जेक्ट आवंटित करके सीएलआर की आवश्यकताओं को पूरा करते हैं।

असल में, यह अभी भी प्रबंधित ढेर पर संदर्भ प्रकार के एक हैंडल बना रहा है, लेकिन अपने आप Dispose()IDisposable पर कार्यान्वयन कॉल जब यह आप के लिए क्षेत्र से बाहर चला जाता है।

ऑब्जेक्ट उदाहरण, हालांकि, प्रभावी रूप से gcnew (प्रबंधित ढेर पर रखा गया) के माध्यम से प्रभावी ढंग से आवंटित किया जाता है और कचरा कलेक्टर द्वारा एकत्र किया जाता है। यह भी विस्तार से समझाया गया है:

जब डी गुंजाइश से बाहर हो जाता है, तो इसके निपटान विधि को इसके संसाधनों को जारी करने की अनुमति देने के लिए बुलाया जाएगा। दोबारा, चूंकि वस्तु वास्तव में प्रबंधित ढेर से आवंटित की जाती है, कचरा कलेक्टर इसे अपने समय में मुक्त करने का ख्याल रखेगा।

असल में, यह सब संकलक द्वारा नियंत्रित कोड देखो बनाने के लिए और मानक सी की तरह काम आवंटित कक्षाएं ढेर ++ करने के लिए है, लेकिन इसकी वास्तव में सिर्फ एक संकलक चाल है। परिणामी आईएल कोड अभी भी प्रबंधित ढेर आवंटन कर रहा है।

+0

ओच। तो मुझे इसे पहचानने के बिना जवाब मिला। मुझे यह इंगित करने के लिए धन्यवाद :-) – Thomas

+0

@ थॉमस कोई समस्या नहीं। यह एक बड़ा पृष्ठ है - आपको यह पता होना चाहिए कि कंपाइलर चालबाजी पर चर्चा खोजने के लिए क्या देखना है;) –

+0

फिर से धन्यवाद, लेकिन ठीक है, आप देखते हैं, ऐसा इसलिए नहीं है क्योंकि यह एक बड़ा पृष्ठ है। मुद्दा यह है कि जब आप मुझे इंगित करते हैं कि मैं अपने प्रश्न का उत्तर देता हूं तो मैं उद्धरण को समझता हूं। लेकिन शायद यह केवल शुरुआती अज्ञान है। और फिर, ज़ाहिर है, अज्ञान आनंद है :-) – Thomas

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