2013-10-27 8 views
6

ECMA-335, I.12.3.2.4 कहा गया है निम्नलिखित: प्रत्येक विधि राज्य केजहां सीएलआर स्थानीय मेमोरी पूल आवंटित करता है?

भाग एक स्थानीय स्मृति पूल है। localloc निर्देश का उपयोग कर मेमोरी को स्थानीय मेमोरी पूल से स्पष्ट रूप से आवंटित किया जा सकता है। स्थानीय मेमोरी पूल में सभी मेमोरी को विधि निकास पर पुनः दावा किया जाता है, और यही एकमात्र तरीका है कि स्थानीय मेमोरी पूल मेमोरी पुनः प्राप्त की जाती है (इस विधि के आमंत्रण के दौरान आवंटित स्थानीय स्थानीय मेमोरी को कोई निर्देश नहीं दिया गया है)। स्थानीय मेमोरी पूल का उपयोग उन वस्तुओं को आवंटित करने के लिए किया जाता है जिनके प्रकार या आकार संकलन समय पर ज्ञात नहीं हैं और प्रोग्रामर प्रबंधित ढेर में आवंटित नहीं करना चाहता है। चूंकि विधि के जीवनकाल के दौरान स्थानीय मेमोरी पूल को कम नहीं किया जा सकता है, इसलिए भाषा कार्यान्वयन सामान्य उद्देश्य स्मृति आवंटन के लिए स्थानीय मेमोरी पूल का उपयोग नहीं कर सकता है।

सीएलआर इस मेमोरी पूल को आवंटित करता है? क्या यह ढेर, थ्रेड स्टैक, आदि प्रबंधित है?

+0

मैं किसी भी प्राधिकारी के साथ नहीं कह सकता, लेकिन यह मुझे आवंटन की तरह लगता है। हालांकि, मुझे संदेह है कि मानक को स्पष्ट रूप से आवश्यकता नहीं है ताकि कार्यान्वयनकर्ताओं को अधिक लचीलापन प्रदान किया जा सके। – Dweeberly

उत्तर

8

यह जानबूझकर अस्पष्ट है क्योंकि यह एक मजबूत कार्यान्वयन विस्तार है कि सीएलआई स्पेक नीचे हटना नहीं चाहता है। यह Opcodes.Localloc हालांकि के लिए MSDN लेख में दरारें के माध्यम से peeks:

StackOverflowException अगर वहाँ अनुरोध की सेवा से अपर्याप्त स्मृति है फेंक दिया है।

आपको कभी भी एक ही तरीका है जिसे आप कभी भी प्राप्त करते हैं: इसे ढेर से आवंटित करने की आवश्यकता होती है।

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

.method private hidebysig static void Main(string[] args) cil managed 
{ 
    .entrypoint 
    // Code size  9 (0x9) 
    .maxstack 8 
    IL_0000: ldc.i4.s 42 
    IL_0002: conv.u 
    IL_0003: ldc.i4.4 
    IL_0004: mul.ovf.un 
    IL_0005: localloc     // <=== Here 
    IL_0007: pop 
    IL_0008: ret 
} // end of method Program::Main 

कौन सा कार्यावधि में इस मशीन कोड का उत्पादन:

02E42620 push  ebp 
02E42621 mov   ebp,esp 
02E42623 sub   esp,8 
02E42626 mov   dword ptr [ebp-4],esp 
02E42629 mov   dword ptr [ebp-8],6A029823h 
02E42630 mov   eax,esp 
02E42632 test  dword ptr [esp],esp 
02E42635 sub   eax,0A8h      // <=== Here 
02E4263A mov   esp,eax 
02E4263C mov   dword ptr [ebp-4],esp 
02E4263F cmp   dword ptr [ebp-8],6A029823h 
02E42646 je   02E4264D 
02E42648 call  730CA5C0 
02E4264D lea   esp,[ebp] 
02E42650 pop   ebp 
02E42651 ret 

sub eax,0A8h अनुदेश घटा देती है ईएसपी से 0xa8 = 168 = 42x4 बाइट्स

class Program { 
    static unsafe void Main(string[] args) { 
     int* p = stackalloc int[42]; 
    } 
} 

इस आईएल का उत्पादन रजिस्टर (स्टैक पॉइंटर), mov esp,eax निर्देश स्टैक पॉइंटर समायोजित करता है। तो हाँ, यह निश्चित रूप से ढेर से आता है।

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