变量本身是否会占用内存?

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

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局部变量而不是类’空字段,它们也消耗内存吗?

变量定义为存储位置。 所以问题是:存储位置是否占用内存

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

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

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

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

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

IHaveNullFields消耗两个指针的大小。

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

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

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

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

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

使用CLR Profiler在运行时确定每个类型的大小