나는 일종의 일리노이 주인이 아니다. 나는 가끔씩 컴파일러가 작성한 코드를 확인하기 위해 그것을 사용한다. 내가 궁금해했던 한 가지는 왜 .maxstack
이 때때로 얻는 가치를 얻는가하는 것입니다. 다음 클래스 고려 : 다음참조를 저장하지 않을 때 더 큰 .maxstack?
public class Sample
{
public void SomeMethod(){}
}
을, 나는 프로그램과 같이이 다음과 같은 경우에 지금
.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)
{
Sample sample = new Sample();
sample.SomeMethod();
}
위의 코드는 다음과 IL (컴파일 된 릴리스를) 제공 프로그램 코드를 다음과 같이 변경합니다.
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
8 번째 코드 샘플에서는 8 번이지만 첫 번째 코드 샘플에서는 1 번입니까? 왜 두 번째 코드가 시스템을 작동시켜 더 큰 스택을 확보하게됩니까?
디버그 모드입니까, 릴리스 모드입니까? 나는 stdloc.0과 ldloc.0의 필요성이 디버깅을 쉽게하는 것 이외에 무엇인지 궁금하다. –
@Cecil : 그것은 릴리스되었습니다 (텍스트에 묻혀 있지만 질문에 명시된대로). –