gpt4 book ai didi

il - 为什么编译器会发出一个 STLoc 后跟一个 ldloca?

转载 作者:行者123 更新时间:2023-12-01 12:39:10 25 4
gpt4 key购买 nike

当我试图了解 Round 实际上做了什么时,我最终查看了一个简单控制台程序的 IL(从 C# .NET 4.5 编译器发出):

.maxstack  2
.locals init (float64 V_0,
float64 V_1)
IL_0000: ldc.r8 2.0001232314135344
IL_0009: stloc.0
IL_000a: ldloca.s V_0
IL_000c: call instance string [mscorlib]System.Double::ToString()
IL_0011: call void [mscorlib]System.Console::WriteLine(string)
IL_0016: ldloc.0
IL_0017: ldc.i4.5
IL_0018: call float64 [mscorlib]System.Math::Round(float64,
int32)
IL_001d: stloc.1
IL_001e: ldloca.s V_1
IL_0020: call instance string [mscorlib]System.Double::ToString()
IL_0025: call void [mscorlib]System.Console::WriteLine(string)
IL_002a: ret

我注意到有关 IL_001d 和 IL_001e 的说明。它们对我来说似乎是多余的,将值存储在本地并在此之后立即加载相同的值。删除它们并重新组装 IL 给我一个 NullReferenceException,所以我猜它有一定的意义。但我想不通。

那么 NullReferenceException 是从哪里来的呢?为什么编译器会发出这两条指令?
没有比上面给出的更多的 IL,当然除了一些元。

最佳答案

ldloca将变量的地址加载到堆栈上(不是变量本身)。所以,这两个命令不是相反的:stloc.1弹出变量值,由 Math::Round 返回, 和 ldloca.s压入 V_1 的堆栈地址,由 Double::ToString 要求称呼。

关于il - 为什么编译器会发出一个 STLoc 后跟一个 ldloca?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26700918/

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