Dot-Net

Nullable<Int32> 的大小是多少?

  • August 24, 2010

所以,實際上有幾個問題:

  1. ( ) 被指定為(顯然)32 位int。( ) 呢Int32?我的直覺告訴我,整數需要 32 位,布爾值需要多 8 位,但實現可能比這更複雜。int?``Nullable&lt;int&gt;
  2. 我會使用sizeof(int?);來回答我自己的問題。但作為int?託管類型,這是不允許的。我知道類型的大小可能取決於平台,並且在對象包含對其他對象的引用的情況下,類似sizeof的操作會產生誤導。但是,在給定目前環境的情況下,有沒有辦法獲得託管類型的“基線”大小(即新實例化實例的大小)?

你可以看看ildasm或反射器。

如果有兩個欄位: abool和 a T,所以可能是 8 個字節(假設 4 個字節對齊)。

永遠不要問這樣的問題是相當重要的,因為你不會得到一個直接的答案。

但既然你還是這樣做了:最小大小是 0 字節。當 JIT 優化器設法將值保存在 CPU 寄存器中時,您將得到它。下一個大小是 2 個字節,對於 bool? 和字節?,HasValue 的 1 個字節,值的另一個字節。你很少會得到,因為局部變數必須與一個 4 的倍數的地址對齊。額外的 2 個字節的填充永遠不會被使用。

下一個尺寸簡稱為3?和 char?,您現在將獲得 1 個字節的填充。

大躍進下一個,int?需要 5 個字節,但填充將其增加到 8 個。

等等。您可以通過編寫如下程式碼來發現這一點:

       int front = 42;
       bool? center = null;
       int back = 43;
       Console.WriteLine("", front, center, back);

並使用調試器查看機器程式碼指令。注意 ebp 寄存器偏移量。並註意堆棧會向下增長。

引用自:https://stackoverflow.com/questions/3559843