2015-11-27 32 views
6

Değer eklemek için aşağıdaki programı kullanıyorum. Ben ana yönteminde yöntem Çağrı ekle ve Ildasm.exe Maxstack boyutu bakarak 2. Ve maxstack boyutunu uncommenting sonraIL kodunda maxstack değerinin hesaplanması

4. Ana yöntemin durumunda tüm değişkenler grubu gibi grup içine gitmiyor neden olur comenting am zaman boyutu sadece 2 kalır, Add metodu çağrısı durumunda her değişken yığına gider? Bu, ana yöntem hesaplamasının tek seferde gerçekleşmesidir, böylelikle her seferinde sadece iki değişkeni alır.

Lütfen karışıklığımı temizleyin.

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; 
} 

cevap

7

Her değişken başlatma: bu yüzden,

.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) 

Bu işlemler sırayla meydana: (1 kadar gerekli yığın boyutu:)

int x = 2; 

yığında olduğu değer gerektirecektir gereken maksimum yığın boyutu hala 1, şu durumlarda:

int y = 3; 
int a = 4; 
int b = 5; 
int c = 6; 
Bu söz konusu olduğunda

Ve:

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

herhangi iki değişken eklemek için, 2'lik bir yığın boyutu gereklidir:

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) 
.... 

diferansiyel IL Ekleme yöntemi altındadır yorumsuz zaman.

bir yöntem ararken, yığın (Ekleme yöntemi statik olmayan olsaydı, yani, onun ilan tipine örnek işaretçisi yığını üzerine itilmesi gerekir)

üzerine, örneğin başvuru itmek gerekir Daha sonra, yönteme geçirilmesi gereken her bir argüman da yığının üzerine itilmelidir.

Bu nedenle, max stack boyutunu tanımlayan, sizin durumunuzda Add yönteminin parametre sayısıdır. Bunu ekle yöntemine bir parametre ekleyin ve maksimum yığın boyutu 5'e artacağını göreceksiniz:

// 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

Biraz üstteki phrasing çimdik ediyorum - bu yığın boşluk kullanır * beyanı * değil, Bu * başlatma *. –

+0

@Damien_The_Unbeliever İnceleme ve düzeltme için teşekkür ederiz. Düzeltiyorum. –

+0

Yani, IL, satır satır oluşturulmaz gibidir. Demek istediğim x = 2 bir yığın spack'i alıyor, o zaman neden başka bir değer beyanı değil? Derleyici, sadece eklemenin gerekli olduğunu bildiğine göre, yığında 2 boşluk olacak enogh olacaktır. – TBAG