gpt4 book ai didi

c# - MichaelJordan 在 .NET 堆栈上创建了多少个 ValueType 实例?

转载 作者:行者123 更新时间:2023-12-03 23:32:04 24 4
gpt4 key购买 nike

我对 .NET 中如何以内存方式管理 ValueType 对象有点困惑。我知道每个实例/声明的值类型都放在堆栈上。我不太确定新实例/声明的构成是什么。我认为我的主要问题是:

如果我将 ValueType 参数传递给方法,但不为其赋值,那么会在堆栈上创建一个新实例吗?

我不确定我的表述是否正确,因此我编写了一个简单的示例程序来更容易理解我的困惑。

void Main()
{
//-------------------------| Line 1:
int MichaelJordan = 23;
//-------------------------| Line 2:
int HoursInADay = 24;
//-------------------------| Line 3:
Console.WriteLine("Michael Jordan is "+(NumberHelper.Is23(MichaelJordan) ? string.Empty : "not ")+"23");
//-------------------------| Line 4:
Console.WriteLine("The last number that wasn't 23 was "+NumberHelper.LastNumberThatWasnt23);
//-------------------------| Line 5:
Console.WriteLine("Hours in a Day is "+(NumberHelper.Is23(HoursInADay) ? string.Empty : "not ")+"23");
//-------------------------| Line 6:
Console.WriteLine("The last number that wasn't 23 was "+NumberHelper.LastNumberThatWasnt23);
}

public static class NumberHelper {
public static int LastNumberThatWasnt23;
public static bool Is23(int candidate){
if(candidate != 23){
LastNumberThatWasnt23 = candidate;
return false;
}
return true;
}
}

所以,这是我对该计划的疑问。

  1. 此程序中的堆栈上创建了多少个整数实例?

  2. 确切地说,每个值类型实例是在代码中的哪个位置创建的?

虽然我很有可能错了,但这就是我认为会发生的事情,也是我不确定的事情。

  • 第 1 行:我知道在堆栈上为变量 MichaelJordan

  • 创建了一个新实例
  • 第 2 行:我知道在堆栈上为变量 HoursInADay

  • 创建了一个新实例
  • 第 3 行: 是变量 MichaelJordan 中创建的值实例的副本命令作为方法参数?是否创建了值 23 的实例用于比较?

  • 第 4 行:LastNumberThatWasnt23 字段的值未初始化,因此它返回默认值。是否为此字段创建了具有默认值的新实例?

  • 第 5 行:与第 3 行相同的问题,而且我知道在堆栈上为字段 LastNumberThatWasnt23 创建了一个新实例,因为我设置它。

  • 第 6 行: 现在,该字段有了一个值。但是,在引用该值并将其传递到 Console.WriteLine 方法中时,我是否在堆栈上创建了一个新的值实例?

这个问题还有一个部分,即我如何找到这样的东西?我可以通过编程来完成吗?有没有可以用来揭示此类信息的工具?

我知道这是一个很长的问题,所以我感谢您花时间阅读它。

最佳答案

这取决于您的机器用于运行该程序的抖动。但由于您仅使用两个局部变量,因此正确答案很可能是零。 jit 优化器将变量值存储在 CPU 寄存器中。这是标准优化之一。

您将在 this answer 中找到有关抖动执行的优化类型的更多信息。 .

关于c# - MichaelJordan 在 .NET 堆栈上创建了多少个 ValueType 实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5358871/

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