gpt4 book ai didi

.net - IL 中的 while 循环 - 为什么是 STLoc.0 和 ldloc.0?

转载 作者:行者123 更新时间:2023-12-04 07:13:26 24 4
gpt4 key购买 nike

我试图了解 IL 中的 while 循环。我已经编写了这个 C# 函数:

    static void Brackets()
{
while (memory[pointer] > 0)
{
// Snipped body of the while loop, as it's not important
}
}

IL 看起来像这样:
.method private hidebysig static void  Brackets() cil managed
{
// Code size 37 (0x25)
.maxstack 2
.locals init ([0] bool CS$4$0000)
IL_0000: nop
IL_0001: br.s IL_0012
IL_0003: nop
// Snipped body of the while loop, as it's not important
IL_0011: nop
IL_0012: ldsfld uint8[] BFHelloWorldCSharp.Program::memory
IL_0017: ldsfld int16 BFHelloWorldCSharp.Program::pointer
IL_001c: ldelem.u1
IL_001d: ldc.i4.0
IL_001e: cgt
IL_0020: stloc.0
IL_0021: ldloc.0
IL_0022: brtrue.s IL_0003
IL_0024: ret
} // end of method Program::Brackets

在大多数情况下,这真的很简单,除了 cgt 之后的部分。

我不明白的是本地 [0] 和 STLoc.0/ldloc.0。在我看来,cgt将结果压入栈中,STLoc.0将结果从栈中取出到局部变量中,ldloc.0再次将结果压入栈中,brtrue.s从栈中读取。

这样做的目的是什么?这不能缩短为 cgt 后跟 brtrue.s 吗?

最佳答案

尝试使用优化进行编译。

关于.net - IL 中的 while 循环 - 为什么是 STLoc.0 和 ldloc.0?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2605056/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com