當存儲在List<DataPoint>
中時,它是12字節還是16字節?這個C#結構的大小是多少?
public struct DataPoint
{
DateTime time_utc;
float value;
}
C#中有沒有sizeof函數?
當存儲在List<DataPoint>
中時,它是12字節還是16字節?這個C#結構的大小是多少?
public struct DataPoint
{
DateTime time_utc;
float value;
}
C#中有沒有sizeof函數?
Marshal.SizeOf()
你可以添加解決方案他的問題:16字節(8字節+ 4字節+ 4字節對齊) – Scoregraphic 2010-09-27 14:17:24
元帥。SizeOf()不會*返回一個託管結構的大小,只有它的非託管版本。檢查史蒂夫的答案。 – 2010-09-27 14:21:38
嘗試Marshal.SizeOf(typeof運算(數據點))
這將是12個字節(4浮法,8日期時間); Marshal.SizeOf
將返回16,因爲默認打包是8個字節對齊。 This是關於結構和包裝的好文章。它給出了實際發生情況的完整描述。
CLR可以自由地將內存中的類型佈置爲它認爲合適的內存。所以不可能直接給出「大小」。
然而,對於結構有可能使用StructLayout Attribute限制CLR的自由:
C#編譯器會自動將順序佈局類型應用於任何結構。 包值分別在x86或x64機器上分別默認爲4或8。所以你的結構的大小是8 + 4 = 12(x86和x64)。
無關從類型如何在內存佈局,它也可以編組使用Marshal Class在.NET中的一個類型。編組器在編組類型時應用幾個轉換,所以結果並不總是與CLR編排類型的方式相同。 (例如,一個bool
需要1個字節的內存加對齊,而編組人員編組bool
到4個字節。)
請注意,使用IL'sizeof'指令可以獲得結構的「final」CLR大小,同時考慮填充和任何其他對齊操作。請參閱[我的博客文章](http://lastyearswishes.com/blog/view/50a30d3bd1f1a5234323b198)瞭解如何使用它以及更多差異(注意:我寫了一個可以從C#調用的包裝庫) – Earlz 2012-11-14 04:06:53
我希望你知道,這個結構的每個實例將被列入盒子時,所以添加指針的空間。 – 2010-09-27 14:19:04
@ToxicAvenger:當你把它放在一個'List'裏面時,它不會被裝箱。儘管如此,它將被放在'ArrayList'或'List
這是更具體的,但可能是重複的http://stackoverflow.com/questions/3361986/how-to-check-the-number-of-bytes-consumed-by-my-strucure – 2010-09-27 14:26:02