何时在声明或初始化时为变量分配内存?

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:声明引用类型的局部变量时,将在堆栈上为该引用分配内存。初始化该变量时,将在堆上为该对象分配内存。

以上是关于何时在声明或初始化时为变量分配内存?的主要内容,如果未能解决你的问题,请参考以下文章

第十二章 类和动态内存分配

TSQL 何时为存储过程中的变量(和表变量)分配内存

x86 汇编 (AT&T):如何在运行时为变量动态分配内存?

类中声明的变量的内存分配

动态内存分配(c++)

传递动态内存