2014-03-31 88 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的回答。因此,結構存儲實際上可以在靜態內存中,在堆棧上或在堆上(在類中)。班級記憶永遠在堆上。