2014-03-31 86 views
5

我正在浏览C#中的类型值,并了解到它们不像正常引用类型那样在堆中分配。具有引用类型的结构如何分配?C#中结构中的引用类型#

例如

 struct simple{ 
      public Employee e; 
      public bool topEmployee; 
      public void printSomething() 
      { 
       Console.WriteLine("Progress " + e.GetProgressReport()); 
       Console.WriteLine("TopEmployee " + topEmployee); 
      } 
     }; 

Employee是一类。初始化时e会分配给堆吗?它是否打败了一个结构?

回答

7

类型(值/引用)的“种类”与实例如何分配无关。这是关于生活的时间,有更多的分配方式比“堆”和“堆栈”。阅读The Truth About Value Types

但是只要你的问题是有道理的:一个结构的成员类型不影响实例结构是如何分配的,因为它们不影响对象的生命周期。顺便说一下,类也一样。

的构件e将是值类型的对象的一部分,并且分配其中可能。本构件是参考,因此任何实际Employee对象e是指将被其他某处分配。虽然听起来像一个,但这不是一个特殊的规则;当地人和班级成员和数组项目的行为方式相同。它不会破坏价值类型的价值,而是维护价值和参考类型的好处。值类型实例仍然是独立的值,而不是别名,并且它们仍然具有更简单和更短的生命周期,从而允许更少的努力进行更好的分配选择。引用类型实例仍然共享并且(可能)长期存在。

至少在概念上,并在当前的实现;在非常简单的情况下优化(逃逸分析+分配沉没)可能合并这些分配,但没有CLR我知道这样做。只要该结构被分配

+0

谢谢!有多少种实现? –

0

参考变量“e”的将被分配(例如装箱结构类型的局部变量是可能去上堆叠)。 'e'指向的Employee实例将被分配到堆上。这在.NET实现中可能会有所不同,但对于当前所有的实现来说可能都是如此。

1

结构内存被“内联”分配。类内存分配在堆上,引用(指针)“内联”分配。

如果你看到一个节目名为C类变量,该变量存储将等同于一个指针(比如4个字节),以及类的实际存储将在堆上。

但是,如果您在程序中看到一个名为S的结构变量,那么该变量的存储空间就是声明时变量的大小。没有堆分配存储。

如果C含有一个S则S将位于所述堆存储为C.

若S包含一个C然后到C参考将位于所述存储为S,和存储为C是在堆上。这是对您的问题simplee的回答。因此,结构存储实际上可以在静态内存中,在堆栈上或在堆上(在类中)。班级记忆永远在堆上。