何时在声明或初始化时为变量分配内存?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了何时在声明或初始化时为变量分配内存?相关的知识,希望对你有一定的参考价值。
考虑C#中的两种情况
Case-1
int a;
a = 10;
[何时何地将内存分配给a
?
Case-2
int a = 10;
这两种情况之间有什么区别,它们在内存分配方面有什么不同?
在执行序言代码时,将在调用堆栈上分配局部变量。因此,在调用函数之前,在当前堆栈帧中会为int变量(和任何参数)保留4个字节。擦除堆栈帧时,该内存已消失,这是函数调用结束时发生的情况。这是您在任何基于堆栈的编程语言中都会看到的相同行为(大部分情况下)。对于这样的一般问题,最好的选择是使用Google搜索事物的工作方式。
唯一的额外内存分配时间是使用new时。在使用new时,将在堆中分配内存,并返回对本地变量的引用(该引用已在函数调用时分配)。
所以,根据您的问题,这取决于。
局部变量/参数-在函数序言代码中引用实例-在您称为新实例时类型中的字段-在创建类型实例时(通过new)初始化是一个完全独立的过程。 ref实例需要进一步讨论。给定以下代码,共有2种分配。
MyClass instance = new MyClass();
第一个分配用于局部变量实例。作为参考变量,它在堆栈上占用4/8个字节。第二个分配在执行new的那一刻发生。堆中的空间已分配给MyClass,您将获得一个引用,该引用随后将分配给您的(已分配的)局部变量。
当函数调用结束时,实例变量将被擦除(因为堆栈框架消失了,而MyClass的实例将一直徘徊,直到GC运行以对其进行清理。
内存是在声明变量时分配的,而不是在初始化时分配的。因此,在第一个示例中,将在到达第一行时分配内存,在第二个示例中,声明和初始化位于同一行,因此显然将在随后分配内存。
Edit:声明引用类型的局部变量时,将在堆栈上为该引用分配内存。初始化该变量时,将在堆上为该对象分配内存。
以上是关于何时在声明或初始化时为变量分配内存?的主要内容,如果未能解决你的问题,请参考以下文章