source

.NETIL .maxstack 지시어는 어떻게 작동합니까?

lovecheck 2023. 5. 17. 23:18
반응형

.NETIL .maxstack 지시어는 어떻게 작동합니까?

.maxstack이 실제로 어떻게 작동하는지 알고 싶습니다.선언하는 유형의 실제 크기가 아니라 유형의 수와 관련이 있다는 것을 알고 있습니다.제 질문은 다음과 같습니다.

  1. 이것은 기능에만 적용됩니까, 아니면 우리가 요구하는 모든 기능에 적용됩니까?
  2. were .maxstack이 선언되는 함수를 위한 것이라고 해도 분기가 있다면 maxstack이 무엇인지 어떻게 알 수 있습니까?모든 "경로"를 확인하고 가능한 최대값을 반환하시겠습니까?
  3. 16으로 설정했는데 실제로 17개의 변수가 있으면 어떻게 됩니까?
  4. 256으로 설정하면 위약금이 너무 큰가요?

.maxstack는 IL 검증의 일부입니다.기본적으로.maxstack메서드에 대해 예약해야 하는 최대 스택 크기를 JIT에 알려줍니다.예를들면,x = y + (a - b)에 해당하는

(의사 IL:)

1. Push y on the stack
2. Push a on the stack
3. Push b on the stack
4. Pop the last two items from the stack,
      substract them and
      push the result on the stack
5. Pop the last two items from the stack,
      add them and
      push the result on the stack
6. Store the last item on the stack in x and
      pop the last item from the stack

보시는 바와 같이 각 시간마다 스택에 최대 3개의 항목이 있습니다.설정했다면.maxstack이 메서드의 경우 코드가 실행되지 않습니다.

또한 무한 스택 크기가 필요하기 때문에 다음과 같은 기능을 사용할 수 없습니다.

1. Push x on the stack
2. Jump to step 1

질문에 대한 답변:

  1. 이것은 기능에만 적용됩니까, 아니면 우리가 요구하는 모든 기능에 적용됩니까?

단지 기능을 위해서입니다.

  1. were .maxstack이 선언되는 함수를 위한 것이라고 해도 분기가 있다면 maxstack이 무엇인지 어떻게 알 수 있습니까?모든 "경로"를 확인하고 가능한 최대값을 반환하시겠습니까?

모든 경로를 확인하고 가능한 최대값을 반환합니다.

  1. 16으로 설정했는데 실제로 17개의 변수가 있으면 어떻게 됩니까?

변수의 수와는 관계가 없습니다. Lasse V. Karlsen의 대답을 참조하십시오.

  1. 256으로 설정하면 위약금이 너무 큰가요?

좋은 생각 같지는 않지만, 잘 모르겠어요.

당신은 정말로 계산해야 합니까?.maxstack당신은? System.Reflection.EmitIIRC를 위해 계산합니다.

선언된 변수의 와는 상관이 없지만, 모든 것은 특정 식을 계산하기 위해 주어진 시간에 스택에 푸시해야 하는 값의 수와 관련이 있습니다.

예를 들어, 다음 식에서 2개의 값을 스택에 푸시해야 한다고 가정합니다.

x = y + z;

이는 x, y, z 등 3개 이상의 변수가 존재하고 다른 변수도 존재할 수 있다는 사실과 무관합니다.

유감스럽게도 저는 당신의 다른 질문에 대한 답을 모릅니다. 그리고 저는 실험이 몇 가지 답을 찾을 수 있는 한 가지 방법이라고 생각합니다.

다음과 ECMA 표준을 참조하여 더 잘 이해할 수 있습니다.

void  msd(string a,
  string b,
  string c,
  string d,
  string e)
  {
  Console.WriteLine(a);
}

msd("a","b","c","d","e");

가 행할때실을 할 때.ildasm.exe제가 할게요.

{
  .entrypoint
  // Code size       40 (0x28)
  .maxstack  8
  IL_0000:  nop
  IL_0001:  nop
  IL_0002:  ldstr      "a"
  IL_0007:  ldstr      "b"
  IL_000c:  ldstr      "c"
  IL_0011:  ldstr      "d"
  IL_0016:  ldstr      "e"
  IL_001b:  call       void sf.Program::'<Main>g__msd|0_0'(string,
                                                           string,
                                                           string,
                                                           string,
                                                           string)
  IL_0020:  nop
  IL_0021:  call       string [mscorlib]System.Console::ReadLine()
  IL_0026:  pop
  IL_0027:  ret
} // end of method Program::Main

위에서부터나는 최대치를 찾았습니다.stakc푸시 & 팝 명령에 의해 결정되지 않는 값입니다.

저는 실제 스택 번호 값이 무엇인지 몰랐습니다.는 그서래, 나참합다니조는▁the를 참조합니다.ildasm실제 최대 스택 값을 결정하는 디스어셈블리 코드.

언급URL : https://stackoverflow.com/questions/1241308/how-does-the-net-il-maxstack-directive-work

반응형