1
我不是任何類型的IL大師,我只是有時用它來檢查編譯器對我編寫的代碼所做的事情。我一直在想的一件事是爲什麼.maxstack
有時會獲得它所獲得的價值。考慮下面的類:不存儲參考時放大.maxstack?
public class Sample
{
public void SomeMethod(){}
}
然後,我有一個這樣的程序:
private static void Main(string[] args)
{
Sample sample = new Sample();
sample.SomeMethod();
}
上面的代碼提供了以下IL(發佈編譯):
.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
// Code size 13 (0xd)
.maxstack 1
.locals init ([0] class ConsoleApplication1.Sample sample)
IL_0000: newobj instance void ConsoleApplication1.Sample::.ctor()
IL_0005: stloc.0
IL_0006: ldloc.0
IL_0007: callvirt instance void ConsoleApplication1.Sample::SomeMethod()
IL_000c: ret
} // end of method Program::Main
現在,如果我將程序代碼更改爲:
private static void Main(string[] args)
{
new Sample().SomeMethod();
}
...它導致以下IL代碼:
.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
// Code size 11 (0xb)
.maxstack 8
IL_0000: newobj instance void ConsoleApplication1.Sample::.ctor()
IL_0005: call instance void ConsoleApplication1.Sample::SomeMethod()
IL_000a: ret
} // end of method Program::Main
第二個IL代碼更短,這是預期的。但是,讓我有點好奇的是爲什麼.maxstack
我在第二個代碼示例中,但在第一個?爲什麼第二個代碼會導致系統爲操作預留更大的堆棧?
這是處於調試還是發佈模式?我不知道stdloc.0和ldloc.0的必要性是什麼,除了使調試更容易。 – 2009-12-15 08:58:03
@Cecil:這是釋放complied(正如在問題中所述,但無論如何埋在文本中)。 – 2009-12-15 09:03:06