什么时候为变量分配内存,是在声明时还是在初始化时?

When will the memory be allocated for the variables, at declaration or at initialization?

考虑 C# 中的两种情况

案例一

int a;
a = 10;

何时何地为 a 分配内存?

案例 2

int a = 10;

这两种情况有什么区别,它们在内存分配方面有何不同?

内存是在声明变量时分配的,而不是在初始化变量时分配的。所以在第一个例子中,内存将在到达第一行时分配,而在第二个例子中,声明和初始化在同一行,所以显然内存将在那时分配。

编辑: 当你声明一个引用类型的局部变量时,栈上的内存被分配给引用。当您初始化该变量时,就会为该对象分配堆上的内存。

局部变量是在序言代码执行时在调用堆栈上分配的。因此,在您的函数甚至被调用之前,在当前堆栈帧中为 int 变量(和任何参数)保留了 4 个字节。当堆栈帧被擦除时,内存就消失了,这就是函数调用结束时发生的情况。这与您在任何基于堆栈的编程语言(大部分)中看到的行为相同。对于像这样的一般问题,最好的办法是使用 google 来搜索其工作原理。

唯一一次分配额外的内存是在你使用 new 的时候。在使用 new 时,内存在堆中分配,并且引用返回到您的局部变量(在函数调用时分配)。

因此,对于您的问题的回答,视情况而定。

本地 variables/parameters - 在函数序言代码中 Ref 实例 - 在您调用 new 时 类型中的字段 - 在创建类型实例时(通过 new) 初始化是一个完全独立的过程。 ref 实例需要更深入的讨论。给定以下代码,有 2 个分配。

MyClass instance = new MyClass();

第一次分配是局部变量实例。作为一个 ref 变量,它在堆栈中占用 4/8 字节。第二次分配发生在执行 new 的时刻。堆中的 Space 分配给 MyClass 并且您取回一个引用,然后将其分配给您的(已分配的)局部变量。

当函数调用结束时,实例变量被擦除(因为堆栈帧消失了),而 MyClass 的实例将挂起,直到 GC 运行以清理它。