2017-09-11 22 views
-1

我有以下几行代码:分配内存以可变在c#

SomeClass a; 
SomeClass b = new SomeClass(); 
SomeClass c = new SomeClass() 
{ 
    Foo="sss", 
    Bar="dddd" 
}; 

请告诉我类实例abc的大小(在存储器中)?

有多少内存分配给每个变量?

+1

实际变量都是相同的大小,因为它们是引用。并且堆中的实际对象也将具有相同的大小(请注意,这些字符串将是单独的对象,该对象具有引用2)。当然,'a'没有实际引用,因为它是'null'。 https://stackoverflow.com/questions/3800882/how-big-is-an-object-reference-in-net – juharr

+0

什么是在堆上,什么是堆栈实际上是一个框架的实现细节。由于是串联实习。并且JiT编译可能会丢失一个,因为它永远不会被使用,并且它是无效代码。所以:可能的最大和最小量之间的任何值,取决于运行时间。更大的问题是:你为什么问?你有什么样的微观优化或错误的道路? – Christopher

回答

0

当你实例化b和c时,内存被自动分配,你不必自己处理它。你可以忘记那个部分,这是被管理的魔法部分,一旦这些对象不再需要(无指针...),垃圾收集器将为你释放内存空间。尽管如此,b和c采用相同的内存大小,因为它是相同的类型。 a没有空间,因为它尚未初始化。

+0

'a'确实在堆栈中为实际变量占用空间,它只是没有引用堆中的任何内容。 – juharr

+0

c#编译器和JIT通常会删除未使用的变量,将它们删除,从而不分配内存? – KitAndKat

+0

这只是一个代码片段,所以可能会有一个'if'后者来设置'a',在这种情况下它不能被优化,但是它可能会编译,就好像'a'甚至不存在。 – juharr