变量本身是否消耗内存?

时间:2010-07-31 14:37:19

标签: c#

当我们声明一个变量时,变量本身是否会消耗内存?

 class IHaveNothing
{
}

class IHaveNullFields
{
    string @string = null;
    StringBuilder @StringBuilder = null;
}

class Program
{      
    static void Main(string[] args)
    {
        IHaveNothing nothing = new IHaveNothing();
        IHaveNullFields nullFields = new IHaveNullFields();
    }
}

实例nullFields是否比实例没有消耗更多内存?

编辑: 如果null局部变量而不是类'null字段,它们也消耗内存吗?

5 个答案:

答案 0 :(得分:12)

是的,它们消耗机器的指针大小(至少)。

答案 1 :(得分:9)

变量已定义作为存储位置。所以问题是:存储位置消耗内存吗?

当你这样说时,听起来很明显答案是肯定的。除了消耗内存之外,存储位置还会做什么?

这不是那么简单。局部变量根本不会消耗内存;本地变量可能由抖动注册。在这种情况下,它既不会占用堆也不会占用堆内存。

为什么要关心? CLR管理内存以为变量创建存储位置的方式是实现细节。除非您编写不安全的代码,否则您不必担心它。

答案 2 :(得分:3)

IHaveNothing消耗1个字节。它消耗一个字节以确保变量位置是唯一的。

IHaveNullFields消耗两个指针的大小。

null局部变量消耗指针的大小。

您可以使用Marshall.SizeOf来确定类的大小。见http://msdn.microsoft.com/en-us/library/y3ybkfb3.aspx

答案 3 :(得分:2)

对于值类型,变量包含值本身,但对于引用类型,对象进入堆(托管内存空间),变量包含指向用于保存的内存块的开头的引用。对象

指针的大小由系统决定,在32位系统上,引用指针为4个字节,对于64位系统,指针为8个字节。

因为引用类型需要每个对象的开销,所以建议对于您可能多次创建的类型,例如任何绘图程序中使用的Point类型,您应该使它们值使用struct关键字的类型。

答案 4 :(得分:1)

use CLR Profiler在运行时确定每种类型的大小

相关问题