什么都没有内存?

时间:2014-05-07 09:52:32

标签: .net memory-management null native nothing

我只是想知道,如果我有一个变量并且我将Nothing(或Null)分配给它,那么变量会占用多少内存?

例如

Dim i as Integer = Nothing

变量是否不使用内存?还是整数的大小,4个字节?基本上我认为这意味着没有分配值,因此在内存中没有任何值,所以它不应该没有内存。但是存储的信息是变量什么都没有,所以这些信息必须记忆,对吧? .NET和本地语言之间有区别吗?或者在价值和参考类型之间?

2 个答案:

答案 0 :(得分:2)

正如@Tim Schmelter在评论中所说,赋值Nothing是C#中default(T)的VB.NET等价物。

Integer总是占用4个字节,32位。无论你投入哪个价值都无关紧要。

但是,如果您有一个引用,它将在32位进程中占用4个字节,在64位进程中占用8个字节,无论您将哪个值放入其中。但是,IntegerSystem.Int32不是引用类型。

Nothing这里并不意味着“没有引用”(正如我原先想的那样),只是你要将类型的默认值分配给变量。在这种情况下,Integer的默认值为0.

因此,您的变量占用4个字节,因为它是System.Int32。您拥有的代码只会为其分配值0

答案 1 :(得分:1)

一般来说:对Null的引用仅占用堆栈上引用本身的空间。在64位系统上应该是8字节。

在您的特定情况下:注意盒装值和未装箱值之间的差异!盒装整数是对Integer类实例的引用。实例未创建(Nothing),因此不占用空间。引用需要8个字节。

如果您使用的是未装箱的值(int),则需要占用int(struct)的空间,这正好是4个字节。请注意,这里没有涉及参考。

使用“常规”类而不是Integer的特殊情况将是一个更简单的示例。例如,考虑

Object o = new Object()

即使o本身为空,它也会在堆栈上占用8个字节。