【问题标题】:Variable Declaration & Memory Allocation变量声明和内存分配
【发布时间】:2014-08-27 21:48:32
【问题描述】:

我想知道在局部变量声明过程中是否分配了内存。

假设我在函数内部写了这段代码,int a =10;内存被分配,值10被存储在里面。

int a; 呢?这个声明语句会分配4个字节的内存吗?

谢谢。

【问题讨论】:

  • 我想是的,因为此时a 的有效值为0
  • 是的,声明一个变量会为其分配空间,直到它超出范围并被垃圾收集。像您的示例这样的结构将具有默认值,其中引用类型将被声明为 null。

标签: c# .net


【解决方案1】:

局部变量通常存储在堆栈中,因此确实为int分配了字节:

int a;

因为它只是使用默认值(0),所以它与:

int a = 0;

int 是一个值类型,所以栈上存储了它的值。如果您要创建具有引用类型的局部变量:

SomeClass a;

然后在堆栈上将只分配 reference(值为 null,因为它是引用类型的默认值)。更多信息可以参考this question

【讨论】:

  • 所以你说的是默认情况下它的值是 0。假设我写 int a;诠释 b=a;我们会得到一个错误,比如“使用未分配的局部变量 a”。在这种情况下,为什么它不采用默认值 0?
  • a 必须具有从 runtime 角度来看的某个值(默认为 0),但如果您使用不带值的值,compiler 会将其视为错误隐式赋值。
  • 并且应该提到编译器通常会删除未使用的局部变量......所以如果你只写 int a;并且永远不要读取它的值,它只会被删除,甚至不会花费你在堆栈上的空间
【解决方案2】:

当你调用一个方法时,每个局部变量的空间都会在栈上分配。

所以如果你在一个方法中声明一个int变量,它的栈帧会额外占用4个字节的内存。

在其他任何地方都没有使用额外的内存,并且在方法返回时被清理。

这里要理解的重要一点是,MSIL 不支持在方法中的任何位置声明属性。每当您在 C# 中声明一个变量时,该声明都会移动到已编译字节码中的方法头。每个变量都是在调用方法时分配的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-12
    • 2014-06-16
    • 2022-01-24
    • 1970-01-01
    • 1970-01-01
    • 2014-01-01
    • 2018-08-12
    • 1970-01-01
    相关资源
    最近更新 更多