2009-04-06 15 views
23

stackalloc कीवर्ड प्रदान करता है जो कार्यक्षमता प्रदान करता है? मैं कब और क्यों इसका उपयोग करना चाहूंगा?मुझे C# में stackalloc कीवर्ड का उपयोग करने की आवश्यकता कब होगी?

+0

@ पॉल: मैंने केवल थोड़ा और पदार्थ जोड़ने के लिए प्रश्न को संशोधित किया। आपके शुरुआती वाक्यांश के साथ वास्तव में कुछ भी गलत नहीं था। – TheTXI

+0

समय लेने के लिए धन्यवाद – PaulB

+0

क्या कोई बता सकता है कि किसी को जवाब में असुरक्षित ऑपरेशन का उपयोग करने की आवश्यकता है? – Sung

उत्तर

18

MSDN से:

ढेर पर स्मृति का एक ब्लॉक आवंटित करने के लिए एक असुरक्षित कोड संदर्भ में प्रयोग किया जाता है।

सी # की मुख्य विशेषताओं में से एक यह है कि आप सामान्य रूप से नहीं सीधे स्मृति का उपयोग करने के लिए, जैसा कि आप सी में करना होगा/C++ malloc या new का उपयोग कर की जरूरत है। हालांकि, अगर आप वास्तव में कुछ स्मृति को स्पष्ट रूप से आवंटित करना चाहते हैं, लेकिन सी # इस "असुरक्षित" को मानता है, तो आप केवल unsafe सेटिंग के साथ संकलित कर सकते हैं। stackalloc आपको ऐसी स्मृति आवंटित करने की अनुमति देता है।

आप लगभग निश्चित रूप से लिखने के लिए इसका इस्तेमाल करने की जरूरत नहीं है कोड में कामयाब रहे। यह संभव है कि कुछ मामलों में आप तेजी से कोड लिख सकते हैं यदि आप सीधे मेमोरी एक्सेस करते हैं - यह मूल रूप से आपको पॉइंटर मैनिपुलेशन का उपयोग करने की अनुमति देता है जो कुछ समस्याओं के अनुरूप है। जब तक आपके पास कोई विशिष्ट समस्या न हो और असुरक्षित कोड एकमात्र समाधान है तो आप शायद कभी इसकी आवश्यकता नहीं होगी।

+2

स्टैक ओवरव्लो बनाया गया है ताकि इंटरनेट पर जो लोग खोज करते हैं उन्हें यहां जवाब मिलेगा (इसे पहले पूछना है)। – TheTXI

+0

दुर्भाग्य से आपने बहुत कठोर किया :) शायद यह व्यक्ति ढेर बनाम ढेर पर स्मृति आवंटित करने के बीच अंतर को समझ में नहीं आता है। आपका जवाब स्पष्ट और अनिश्चित था। –

+0

एडम, मैं जरूरी नहीं सहमत हूं। वह * शायद * अपने प्रश्न को अलग-अलग वाक्यांशित कर देगा, उदाहरण के लिए 'मुझे स्टैकलोक कीवर्ड का उपयोग कब करना होगा?'। – Razzie

3

http://msdn.microsoft.com/en-us/library/cx9s2sy4.aspx

इस कीवर्ड असुरक्षित स्मृति में गड़बड़ी के साथ काम किया जाता है। इसका उपयोग करके, आपके पास पॉइंटर (सी/सी ++ में एक शक्तिशाली और दर्दनाक सुविधा) का उपयोग करने की क्षमता है

2

stackalloc स्टैक पर स्मृति आवंटित करने के लिए .NET रनटाइम को निर्देशित करता है।

0

यह है स्टीव की तरह ने कहा, केवल असुरक्षित कोड संदर्भ में प्रयोग किया (उदा, आप संकेत का उपयोग करना चाहते हैं)।

यदि आप अपने सी # एप्लिकेशन में असुरक्षित कोड का उपयोग नहीं करते हैं, तो आप कभी की आवश्यकता नहीं होगी।

9

पॉल,

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

+2

+1 ध्यान दें कि बचने के विश्लेषण के कारण, 'प्रबंधित' को स्टैक पर आवंटित किया जा सकता है। – Sung

15

Stackalloc ढेर है, जो कचरा है कि बार-बार पैदा करने और एक विधि के भीतर मूल्य प्रकार के सरणियों को नष्ट करके उत्पन्न होगा से बचने के लिए इस्तेमाल किया जा सकता पर डेटा आवंटित करेगा।

public unsafe void DoSomeStuff() 
{ 
    byte* unmanaged = stackalloc byte[100]; 
    byte[] managed = new byte[100]; 

    //Do stuff with the arrays 

    //When this method exits, the unmanaged array gets immediately destroyed. 
    //The managed array no longer has any handles to it, so it will get 
    //cleaned up the next time the garbage collector runs. 
    //In the mean-time, it is still consuming memory and adding to the list of crap 
    //the garbage collector needs to keep track of. If you're doing XNA dev on the 
    //Xbox 360, this can be especially bad. 
} 
+0

के लिए धन्यवाद – rightfold

0

अधिकतर उत्तर ओपी के प्रश्न के "कार्यक्षमता" भाग पर केंद्रित हैं।
मेरा मानना ​​है कि यह कब और क्यों जवाब देगा:

आपको इसकी आवश्यकता कब है?
कई छोटे सरणियों के कैश इलाके के साथ सबसे अच्छा बुरी से बुरी हालत प्रदर्शन के लिए

अब औसत ऐप में आपको इसकी आवश्यकता नहीं होगी, लेकिन रीयलटाइम संवेदनशील परिदृश्यों के लिए यह अधिक निर्धारक प्रदर्शन प्रदान करता है: कोई जीसी शामिल नहीं है और आप सभी कैश हिट की गारंटी देते हैं।
(क्योंकि सबसे खराब केस प्रदर्शन औसत प्रदर्शन से अधिक महत्वपूर्ण है।)

ध्यान रखें कि .NET में डिफ़ॉल्ट स्टैक आकार छोटा है!
(मुझे लगता है कि यह सामान्य ऐप्स के लिए 1 एमबी और एएसपीनेट के लिए 256 केबी है?)

प्रैक्टिकल उपयोग उदाहरण के लिए रीयलटाइम ध्वनि प्रसंस्करण शामिल हो सकता है।

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