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)
Biraz üstteki phrasing çimdik ediyorum - bu yığın boşluk kullanır * beyanı * değil, Bu * başlatma *. –
@Damien_The_Unbeliever İnceleme ve düzeltme için teşekkür ederiz. Düzeltiyorum. –
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