2010-09-27 25 views
9

當存儲在List<DataPoint>中時,它是12字節還是16字節?這個C#結構的大小是多少?

public struct DataPoint 
{ 
    DateTime time_utc; 
    float value; 
} 

C#中有沒有sizeof函數?

+0

我希望你知道,這個結構的每個實例將被列入盒子時,所以添加指針的空間。 – 2010-09-27 14:19:04

+6

@ToxicAvenger:當你把它放在一個'List '裏面時,它不會被裝箱。儘管如此,它將被放在'ArrayList'或'List '中。 – Ruben 2010-09-27 14:22:09

+0

這是更具體的,但可能是重複的http://stackoverflow.com/questions/3361986/how-to-check-the-number-of-bytes-consumed-by-my-strucure – 2010-09-27 14:26:02

回答

14

查看@Hans Passant的回答here,瞭解關於此問題的有趣背景,關於Marshal.Sizeof的限制。

+8

是的,很好的回答:) – 2010-09-27 14:20:47

8
+1

你可以添加解決方案他的問題:16字節(8字節+ 4字節+ 4字節對齊) – Scoregraphic 2010-09-27 14:17:24

+3

元帥。SizeOf()不會*返回一個託管結構的大小,只有它的非託管版本。檢查史蒂夫的答案。 – 2010-09-27 14:21:38

0

嘗試Marshal.SizeOf(typeof運算(數據點))

2

這將是12個字節(4浮法,8日期時間); Marshal.SizeOf將返回16,因爲默認打包是8個字節對齊。 This是關於結構和包裝的好文章。它給出了實際發生情況的完整描述。

6

CLR可以自由地將內存中的類型佈置爲它認爲合適的內存。所以不可能直接給出「大小」。

然而,對於結構有可能使用StructLayout Attribute限制CLR的自由:

  • 自動:運行時會自動選擇合適的佈局。
  • 連續:對象的成員按順序排列,並根據StructLayoutAttribute.Pack值進行對齊。
  • 明確:明確控制每個成員的確切位置。

C#編譯器會自動將順序佈局類型應用於任何結構。 值分別在x86或x64機器上分別默認爲4或8。所以你的結構的大小是8 + 4 = 12(x86和x64)。


無關從類型如何在內存佈局,它也可以編組使用Marshal Class在.NET中的一個類型。編組器在編組類型時應用幾個轉換,所以結果並不總是與CLR編排類型的方式相同。 (例如,一個bool需要1個字節的內存加對齊,而編組人員編組bool到4個字節。)

+0

請注意,使用IL'sizeof'指令可以獲得結構的「final」CLR大小,同時考慮填充和任何其他對齊操作。請參閱[我的博客文章](http://lastyearswishes.com/blog/view/50a30d3bd1f1a5234323b198)瞭解如何使用它以及更多差異(注意:我寫了一個可以從C#調用的包裝庫) – Earlz 2012-11-14 04:06:53