繁体   English   中英

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

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

考虑 C# 中的两种情况

情况1

int a;
a = 10;

何时何地为a分配内存?

案例 2

int a = 10;

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

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

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

所以,回答你的问题,这取决于。

局部变量/参数 - 在函数序言代码 Ref 实例期间 - 在您调用类型中的新字段时 - 在创建类型实例时(通过 new) 初始化是一个完全独立的过程。 ref 实例有更深入的讨论。 鉴于以下代码,有 2 个分配。

MyClass instance = new MyClass();

第一次分配用于局部变量实例。 作为 ref 变量,它在堆栈上占用 4/8 个字节。 第二次分配发生在 new 被执行的那一刻。 堆中的空间是为 MyClass 分配的,你会得到一个引用,然后将它分配给你的(已经分配的)局部变量。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM