2013-04-25 67 views
1

其實,我很願意知道多少內存是由以下數據類型如何計算可空的大小<T>數據類型

INT消耗? =內存大小?

double? =內存大小?

bool? =內存大小?

任何人可以給我講述了他們儲存或使用方法的信息來計算其規模

+0

它沒有得到任何答覆,必須有一個確切的答案,每個人只是從不同的博客複製和粘貼答案。他們不喜歡的事件 – 2013-04-26 03:54:18

回答

1

您是否想知道記憶體的消耗量?一個int? x? MSDN說:

...公共語言運行庫分配基於您的應用程序是 執行平臺的 特性存儲。在某些情況下,它儘可能將您聲明的元素儘可能緊密地包裝在一起,即 ;在其他情況下,它將內存地址與自然硬件邊界對齊。此外,在64位平臺上的存儲分配不同於在32位平臺上的 。

同樣的考慮適用於複合數據類型 的每個成員,如結構或數組。此外,某些複合類型 還有額外的內存要求。例如,數組使用額外的 內存用於數組本身,也用於每個維度。在32位的 平臺上,此開銷當前爲12個字節加上每個 維度的8個字節。在64位平臺上,需求增加了一倍。您不能 依賴於簡單地將 組件的名義存儲分配相加。

除了包含在數據類型中的數據之外,引用任何基本或複合數據類型的對象還使用4個 個字節。

+0

Mithrandir能否請你以一般方式解釋以上內容,因爲我想知道的是雙重嗎?(可爲空)將佔用32位計算機上的多少字節,以及在64位計算機上佔用多少雙倍(可空雙精度)。 – 2013-04-25 13:59:59

+0

實際尺寸可能因系統而異。您可以使用sizeof()在運行時獲取實際值,但那又如何? – Mithrandir 2013-04-25 14:06:50

+0

請嘗試,如果你可以,因爲我已經嘗試過,但我不能我已經試過每一個愚蠢的把戲 – 2013-04-25 14:12:45

2

的答案,我相信,是here

基本上,增加的對大小非空的大小布爾。

1

您可以使用以下代碼在運行時獲取實際大小。返回的值將與數組int?[]的元素對齊相同,該值與CLI的sizeof操作碼(ECMA-335分區I,第8.9.1節)返回的值一致。由於可爲空的類型被視爲引用類型,因此即使在不安全的上下文中,C#sizeof運算符也不能用於此目的。相反,我們使用TypedReference和一個2元素數組來計算相同的信息。

public static int SizeOf<T>() 
{ 
    T[] array = new T[2]; 
    TypedReference elem1 = __makeref(array[0]); 
    TypedReference elem2 = __makeref(array[1]); 

    unsafe 
    { 
     byte* address1 = (byte*)*(IntPtr*)(&elem1); 
     byte* address2 = (byte*)*(IntPtr*)(&elem2); 
     return (int)(address2 - address1); 
    } 
} 

然後,您可以使用以下內容。

// This returns 8 on my test, but the runtime is free to change this to 
// any value greater than sizeof(int)+sizeof(bool) 
int nullableSize = sizeof(int?); 
+0

絕對錯誤的答案請不要誤導上述代碼將不會被編譯 – 2013-04-25 14:06:11

+0

當然它編譯。您需要在項目的「構建」選項中勾選「允許不安全代碼」。 – Andez 2016-04-11 12:36:50