gpt4 book ai didi

c# - 为什么基于堆栈的 IL 字节码中有局部变量

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:58:44 24 4
gpt4 key购买 nike

在基于堆栈的中间语言中,例如 CIL 或 Java 字节码,为什么会有局部变量? 可以只使用堆栈。手工制作的 IL 可能不是那么容易,但编译器肯定可以做到。但是我的 C# 编译器没有。

堆栈和局部变量都是方法私有(private)的,并且在方法返回时超出范围。所以它与从方法外部(从另一个线程)可见的副作用没有任何关系。

如果我是正确的,JIT 编译器在生成机器代码时会消除对堆栈槽和局部变量的加载和存储,因此 JIT 编译器也看不到对局部变量的需要。

另一方面,C# 编译器会为局部变量生成加载和存储,即使在启用优化的情况下进行编译也是如此。为什么?


例如,以下人为设计的示例代码:

static int X()
{
int a = 3;
int b = 5;
int c = a + b;
int d;
if (c > 5)
d = 13;
else
d = 14;
c += d;
return c;
}

当在 C# 中编译时,经过优化,它会产生:

    ldc.i4.3        # Load constant int 3
stloc.0 # Store in local var 0
ldc.i4.5 # Load constant int 5
stloc.1 # Store in local var 1
ldloc.0 # Load from local var 0
ldloc.1 # Load from local var 1
add # Add
stloc.2 # Store in local var 2
ldloc.2 # Load from local var 2
ldc.i4.5 # Load constant int 5
ble.s label1 # If less than, goto label1
ldc.i4.s 13 # Load constant int 13
stloc.3 # Store in local var 3
br.s label2 # Goto label2
label1:
ldc.i4.s 14 # Load constant int 14
stloc.3 # Store in local var 3
label2:
ldloc.2 # Load from local var 2
ldloc.3 # Load from local var 3
add # Add
stloc.2 # Store in local var 2
ldloc.2 # Load from local var 2
ret # Return the value

注意四个局部变量的加载和存储。我可以在不使用任何局部变量的情况下编写完全相同的操作(忽略明显的常量传播优化)。

    ldc.i4.3        # Load constant int 3
ldc.i4.5 # Load constant int 5
add # Add
dup # Duplicate top stack element
ldc.i4.5 # Load constant int 5
ble.s label1 # If less than, goto label1
ldc.i4.s 13 # Load constant int 13
br.s label2 # Goto label2
label1:
ldc.i4.s 14 # Load constant int 14
label2:
add # Add
ret # Return the value

这对我来说似乎是正确的,而且更短、更高效。那么,为什么基于堆栈的中间语言会有局部变量呢?为什么优化编译器如此广泛地使用它们?

最佳答案

视情况而定,尤其是当涉及必须重新排序参数以匹配调用的调用时,如果您没有可供使用的寄存器或变量,那么纯堆栈是不够的。如果你想让这个堆栈成为唯一的,你需要额外的堆栈操作能力,比如交换/交换堆栈顶部的两个项目的能力。

最后,虽然在这种情况下可以将所有内容都表达为纯粹基于堆栈的,但它会给代码增加很多复杂性,使其膨胀并使其更难以优化(局部变量是理想的缓存在寄存器中的候选者)。

还请记住,在 .NET 中,您可以通过引用传递参数,如果没有局部变量,您如何为该方法调用创建 IL?

bool TryGet(int key, out string value) {}

关于c# - 为什么基于堆栈的 IL 字节码中有局部变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12451626/

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