2011-07-21 104 views
3

當我們實例化類/結構時,它將在堆棧以及堆中分配多少內存Student?創建對象時的內存分配

我猜id = 4字節引用(32位機器)和名稱= 4字節引用和facultyAdvisor = 4字節引用。所以總共12個字節的堆棧和實際大小將堆在一起。這堆大小可能會有所不同取決於我們分配給使用對象obj(Student obj = new Student())的字段(id,name,facultyAdvisor)的值。

結構也一樣嗎?

public class Student { int id; string name; Professor facultyAdvisor; } 

public struct Student { int id; string name; Professor facultyAdvisor; } 

回答

1

假設32位CLR(引用將64位上的64位CLR)和僅考慮到堆分配爲學生

類學生{}類教授{}

  • 堆棧: 4個字節
  • 堆:4個字節(int)的+ 4個字節(參考教授)+ 4個字節(串參考)+ 12個字節(對象頭)= 24個字節

類學生{}結構教授{}

  • 堆棧:4個字節
  • 堆:4個字節(int)的+的處理器+ 4個字節(串參考)+ 12字節大小(對象標頭) = ??字節

結構學生{}類教授{}

  • 堆棧:4個字節(int)的+ 4個字節(串參考)+ 4個字節(教授參考)= 12個字節
  • 堆:0字節

結構學生{}結構教授{}

  • 堆棧:4字節(int)+ 4字節(字符串引用)+教授大小= ??字節
  • 堆:0字節
+0

不要忘記'name'的字符串引用... –

+0

感謝喬恩 - 由於某種原因,我錯過了名字 - 編輯 –

+0

class Student {} class Professor {} 堆棧:4字節 堆:4字節(int)+ 4字節(Professor Reference)+ 4字節引用)+ 12字節(對象頭)= 24字節 在這種情況下,4個字節(教授引用)將在堆中?如果是這樣,實際對象生活? 另外,正如你說的堆棧中的4個字節,這4個字節的堆棧引用指向所有的字段(id,name和facultyAdvisor)。可能嗎? – Alavudeen

0

您可以使用GC.GetTotalMemory(true)來電來衡量內存消耗之前和之後實例來衡量堆分配

5

首先注意到stack and the heap are implementation details ......因爲是對象的大小。但在目前的實施中,字段內的所有數據在Student之內。有一個對象的開銷以及爲這些字段所佔用的內存,但所有這些都將在堆上。

如果你保持參考到新的實例,而你沒有保持它在未捕獲的局部變量在迭代器塊或異步方法,該引用是在棧上(在當前的實現),所以它將在32位CLR上爲4個字節。

Student是一個結構,事情有所變化:

  • 的數據的位置(堆棧或堆)取決於如何被使用的值 - 如果它存儲在一個實例變量在類,例如,它將與其他數據一起堆在一起;如果它在一個局部變量的(再次,未捕獲而不是在迭代器塊或異步方法),那麼這將是堆棧
  • 你沒有創建一個獨立的對象,只是上,所以有沒有額外的開銷 - 它真的只會採取12個字節(假設Professor是引用類型)

我有一對夫婦的文章/帖子可能對您有用:

編輯:解決Professor問題,假設Professor是一類 - 除非明確創建Professor對象,在Student引用將簡單地爲空。創建一個新的Student確實不是只是因爲有一個該類型的字段而自動創建一個新的Professor。到Professor參考僅僅是Student數據的一部分 - 它生活的地方的id生活 - 所以,如果Student是一個類,則引用只存在於堆,如果Student是一個結構那就要看在Student值被創建,如上所列。

+0

編輯該問題。請回答 – Alavudeen

+0

@Alavudeen:完成,雖然我不太確定我是否理解編輯的問題。如果我的編輯不符合您的要求,請澄清問題。 –

+0

我用你的答案澄清了我編輯的問題。但仍然無法得出結論 – Alavudeen