簡體   English   中英

.NET CLR:運行時如何計算對象的大小?

[英].NET CLR: How does runtime calculate size of object?

.NET中大型對象堆,可用於大小超過85kb的對象。 據我了解堆中對象的大小是這樣計算的

  1. 基本類型的所有屬性和字段以及值類型的實例的大小(因為它們存儲在父實例中)
  2. 對其他類實例的引用的大小(因為它們是分開存儲的)。

例子:

  1. 10個引用類型的對象(每個10kb )和一個包含所有引用類型的引用類型的對象=>不應將所有對象放入LOH
  2. 2個引用類型的對象(每個86kb )和包含所有引用類型的引用類型的對象=> LOH中為2個對象,但通常堆中的最后一個

它是正確的計算方案嗎? 我的例子正確嗎?

CLR中引用類型的分配成本由固定的開銷(取決於體系結構)加上其成員的總量(最終都是值,甚至是引用,4字節或8字節)組成。

請參閱: .NET對象的內存開銷是多少?

它不會分配引用對象的存儲空間,而只會分配引用值。

如果您分配10KB的對象,它將不會達到LOH。

如果分配10 x 10KB 的數組,則列表和對象都不會在LOH中。 實際上,該列表將是10x 大小的參考體系結構數組。

如果您的類是struct ,則列表將包含容納10KB的結構所需的內存空間,即10次,理論上,它將在LOH上對列表(以及值類型,也包括對象)進行排序。

別忘了, List<T>基於算法分配空間(當前為x * 2)。 占用空間的不是您放入列表中的內容,而是列表當前具有的Capacity

LOH分配限制是運行時的實現細節,並且可能會更改。 看看它是如何工作的很有趣,但是不要構建任何依賴於當前工作方式的東西。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM