2015-11-27 12 views
6

में अधिकतमस्टैक मान की गणना मेरे पास मूल्य जोड़ने के लिए निम्न प्रोग्राम है। जब मैं मुख्य विधि में विधि कॉल जोड़ रहा हूं और ILDASM.EXE मैक्सस्टैक आकार को देख रहा हूं 2. और अधिकतमस्टैक आकार को असम्बद्ध करने के बाद 4.आईएल कोड

मुख्य विधि के मामले में क्यों सभी चर ढेर के रूप में नहीं जा रहे हैं आकार केवल 2 रहता है, जबकि ऐड विधि कॉल के मामले में प्रत्येक चर ढेर में जाता है? क्या यह मामला है कि मुख्य विधि गणना के अंदर एक-एक करके हो रहा है ताकि एक समय में केवल दो चर लग जाए।

कृपया मेरा भ्रम साफ़ करें।

static void Main(string[] args) 
{ 
    int x = 2; 
    int y = 3; 
    int a = 4; 
    int b = 5; 
    int c = 6; 

    Console.WriteLine(x + y + a + b + c); 
    Console.WriteLine(Add(10, 20, 30, 40)); 
    Console.ReadLine(); 
} 

static int Add(int x, int y, int z, int a) 
{ 
    return x + y + z + a; 
} 

उत्तर

7

प्रत्येक चर प्रारंभ: इसलिए

.locals init ([0] int32 x, 
     [1] int32 y, 
     [2] int32 a, 
     [3] int32 b, 
     [4] int32 c) 
IL_0000: ldc.i4.2 // push 2 to the stack 
IL_0001: stloc.0 // load local variable 0 from stack (x = 2) 

ये अभियान क्रमिक रूप से होता है,

int x = 2; 

मूल्य की आवश्यकता होती है ढेर पर होना होगा:: (1 अब तक आवश्यक ढेर आकार) अधिकतम स्टैक आकार की आवश्यकता अभी भी 1 है,

int y = 3; 
int a = 4; 
int b = 5; 
int c = 6; 

और जब यह यह करने के लिए आता है:

Console.WriteLine(x + y + a + b + c); 

किसी भी दो चर जोड़ने के लिए, 2 के ढेर आकार की जरूरत है:

IL_000b: ldloc.0 // copy to stack x, max stack size required is still 1. 
IL_000c: ldloc.1 // copy to stack y, max stack size required is 2 now. 
IL_000d: add  // execute add, will cause the sum x + y to be on stack 
IL_000e: ldloc.2 // copy to stack a 
IL_000f: add  // execute add... (adds a to the result of x + y) 
.... 

अंतर आईएल आप जब uncomment विधि जोड़ें के नीचे है।

जब एक विधि बुला, आप ढेर (जिसका अर्थ है, अगर विधि जोड़ें गैर स्थिर किया गया था, इसकी घोषणा के प्रकार के उदाहरण सूचक ढेर पर धकेल दिया जाना चाहिए)

पर उदाहरण के संदर्भ पुश करने के लिए की जरूरत है फिर, प्रत्येक तर्क जिसे विधि में पारित करने की आवश्यकता है उसे स्टैक पर भी धक्का दिया जाना चाहिए।

इसलिए, यह आपके मामले में ऐड विधि के पैरामीटर की संख्या है जो अधिकतम स्टैक आकार को परिभाषित करता है। इस विधि जोड़े में एक पैरामीटर जोड़ें, और आप उस अधिकतम ढेर आकार 5 की वृद्धि होगी देखेंगे:

// method is static so no need to push an instance pointer to the stack 
IL_001a: ldc.i4.s 10 // push to stack 
IL_001c: ldc.i4.s 20 // push to stack 
IL_001e: ldc.i4.s 30 // push to stack 
IL_0020: ldc.i4.s 40 // push to stack 
IL_0022: call  int32 Program::Add(int32, 
             int32, 
             int32, 
             int32) 
IL_0027: call  void [mscorlib]System.Console::WriteLine(int32) 
+0

मैं थोड़ा शीर्ष पर शब्दों tweak चाहते हैं - यह * घोषणा * ढेर अंतरिक्ष का उपयोग करता है नहीं है, यह * प्रारंभिक * है। –

+0

@Damien_The_Unbeliever समीक्षा और सुधार के लिए धन्यवाद। इसे ठीक करना –

+0

तो क्या यह आईएल की तरह लाइन से उत्पन्न नहीं है। मेरा कहना है कि एक्स = 2 एक स्टैक स्पैक लेता है तो अन्य मूल्य घोषणा क्यों नहीं? क्या ऐसा लगता है कि कंपाइलर को यह पता चला कि उसे केवल जोड़ों की आवश्यकता है ताकि ढेर में 2 स्थान enogh होगा। – TBAG

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