2010-07-30 30 views
9
public class MyClass 
{ 
    int i = 0; 
    string str = "here"; 
    MyStruct mystruct; 
    B b; 
    ArrayList myList = new ArrayList(10); 

    public MyClass() 
    { 
    } 
    .... 
} 

public struct MyStruct 
{ 
    public int i; 
    public float f; 
} 

public class B 
{ 
    ... 
} 

想要了解如何在後臺創建類的實例。當此聲明C#如何創建一個類的實例?

MyClass myClass = new MyClass(); 

被評估。背景會發生什麼?我的下列語句是否正確(對於32位OS機器)?

  1. 將創建一個內存空間並引用爲myClass;
  2. 在上面的內存空間中,4字節用於int i的值;
  3. 在上面的內存空間中,4字節用於參考string str; str的實際值存儲在其他位置(其中?)
  4. 在上面的內存空間中,8字節用於值MyStruct mystruct(因爲MyStruct是8字節);
  5. 在上述內存空間內,4字節用於B b對象的引用; b對象的內存將在實例化時分配到其他位置;
  6. 在上面的內存空間中,4字節用於參考ArrayList myList; ArrayList myList的實際存儲空間分配在其他地方,並在此處引用爲myList;
  7. 上面的內存空間的另外4或8個字節用於對象元數據;
  8. ...;

回答

2

你有基本的想法。除了包含的內容外,這些實際細節都是特定於實現的。然而,對於你的幾點:

3)實際字符串通常存儲在自己的內存空間,就像任何其他類。但是,由於在這種情況下你使用的是字符串,它很可能在字符串intern池中,這是(我相信)存儲在大對象堆中。有關字符串實習的詳細信息,請參閱String.Intern。 (如果您在運行中分配字符串,而不是使用文字,則字符串將存儲在應用程序的正常託管堆中。)

1

就是這樣。

該字符串存儲在字符串表中,而不是作爲堆中的自由浮動對象。需要注意的是,只有一個該字符串的實例被實例化,而不管實例化的MyClass的實例數。

1

7.使用上面內存空間的另外4或8個字節對象 元數據

這將是8個字節。 4爲同步塊,4爲類型信息。

您可以在此question中找到有關該主題的更多信息。