Dot-Net
Nullable<Int32> 的大小是多少?
所以,實際上有幾個問題:
- ( ) 被指定為(顯然)32 位
int。( ) 呢Int32?我的直覺告訴我,整數需要 32 位,布爾值需要多 8 位,但實現可能比這更複雜。int?``Nullable<int>- 我會使用
sizeof(int?);來回答我自己的問題。但作為int?託管類型,這是不允許的。我知道類型的大小可能取決於平台,並且在對象包含對其他對象的引用的情況下,類似sizeof的操作會產生誤導。但是,在給定目前環境的情況下,有沒有辦法獲得託管類型的“基線”大小(即新實例化實例的大小)?
你可以看看
ildasm或反射器。如果有兩個欄位: a
bool和 aT,所以可能是 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 寄存器偏移量。並註意堆棧會向下增長。