gpt4 book ai didi

c# - 什么时候函数内的局部变量*实际上*被分配

转载 作者:行者123 更新时间:2023-11-30 13:07:28 30 4
gpt4 key购买 nike

就是好奇这个。以下是同一功能的两个代码片段:

void MyFunc1()
{
int i = 10;
object obj = null;

if(something) return;
}

而另一个是...
void MyFunc1()
{
if(something) return;

int i = 10;
object obj = null;
}

现在,当 某些 为真时,第二个是否具有不分配变量的好处?或者本地堆栈变量(在当前范围内)总是在函数被调用后立即分配并且将 return 语句移到顶部没有效果?

A link to dotnetperls.com article “当您在 C# 程序中调用一个方法时,运行时会分配一个单独的内存区域来存储所有局部变量槽。即使您没有访问函数调用中的变量,也会在堆栈上分配该内存。”

更新
下面是这两个函数的 IL 代码的比较。 Func2 指的是第二个剪辑。似乎这两种情况下的变量都是在开始时分配的,但在 Func2() 的情况下,它们稍后被初始化。所以我猜没有任何好处。

最佳答案

当您运行它时,确定您的程序何时发生这种情况的唯一方法是查看 JIT 编译器在您运行程序时发出的代码。我们甚至都不能权威地回答具体问题(好吧,我猜写 CLR 的人可以,只要他们知道您使用的是哪个版本的 CLR,并且可能知道有关配置和实际程序代码的其他一些细节)。

局部变量堆栈上的任何分配都是严格的“实现细节”。 CLS 不向我们 promise 任何具体的实现。

一些本地变量本身永远不会在堆栈上结束,通常是由于存储在寄存器中,但运行时使用堆空间代替是合法的,只要它保留本地变量的正常生命周期语义。

另请参阅 Eric Lippert 的优秀系列 The Stack Is An Implementation Detail

关于c# - 什么时候函数内的局部变量*实际上*被分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29271452/

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