.NETIL .maxstack 지시어는 어떻게 작동합니까?
.maxstack이 실제로 어떻게 작동하는지 알고 싶습니다.선언하는 유형의 실제 크기가 아니라 유형의 수와 관련이 있다는 것을 알고 있습니다.제 질문은 다음과 같습니다.
- 이것은 기능에만 적용됩니까, 아니면 우리가 요구하는 모든 기능에 적용됩니까?
- were .maxstack이 선언되는 함수를 위한 것이라고 해도 분기가 있다면 maxstack이 무엇인지 어떻게 알 수 있습니까?모든 "경로"를 확인하고 가능한 최대값을 반환하시겠습니까?
- 16으로 설정했는데 실제로 17개의 변수가 있으면 어떻게 됩니까?
- 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
질문에 대한 답변:
- 이것은 기능에만 적용됩니까, 아니면 우리가 요구하는 모든 기능에 적용됩니까?
단지 기능을 위해서입니다.
- were .maxstack이 선언되는 함수를 위한 것이라고 해도 분기가 있다면 maxstack이 무엇인지 어떻게 알 수 있습니까?모든 "경로"를 확인하고 가능한 최대값을 반환하시겠습니까?
모든 경로를 확인하고 가능한 최대값을 반환합니다.
- 16으로 설정했는데 실제로 17개의 변수가 있으면 어떻게 됩니까?
변수의 수와는 관계가 없습니다. Lasse V. Karlsen의 대답을 참조하십시오.
- 256으로 설정하면 위약금이 너무 큰가요?
좋은 생각 같지는 않지만, 잘 모르겠어요.
당신은 정말로 계산해야 합니까?.maxstack
당신은? System.Reflection.Emit
IIRC를 위해 계산합니다.
선언된 변수의 수와는 상관이 없지만, 모든 것은 특정 식을 계산하기 위해 주어진 시간에 스택에 푸시해야 하는 값의 수와 관련이 있습니다.
예를 들어, 다음 식에서 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
'source' 카테고리의 다른 글
Bash 함수에서 반환 및 종료 간의 차이 (0) | 2023.05.17 |
---|---|
SourceKit 서비스가 CPU를 사용하고 X코드를 그라인딩하여 중지 (0) | 2023.05.17 |
ng-filename : 단일 필드로 필터링 (0) | 2023.05.17 |
PostgreSQL에서 테이블을 만들 때 열에 주석을 추가하시겠습니까? (0) | 2023.05.17 |
왜 파이썬 3.4에 비해 파이썬 3.5에서 str.translate가 훨씬 빠릅니까? (0) | 2023.05.17 |