簡體   English   中英

如何確定.NET中的數據類型有多大?

[英]How do I determine how big a data type is in .NET?

我想加深對數據類型的理解,並想知道如何確定數據類型的大小。 我希望通往答案的旅程能夠揭開其他未知數。

我知道在.NET中,一個字節是一個8位無符號整數,但這只是因為我讀過它。 如果我有一個非常簡單的控制台應用程序,如下所示:

static void Main(string[] args)
{
byte b = 1;
}

我怎么能在Visual Studio中告訴'b'的數據結構有多大? 我看到有一些內存診斷窗口,但它只是說當我跳過b的分配時他們無法評估表達式。 我打開了Disassembly窗口,可以看到mov op ...

mov         dword ptr [ebp-40h],1

......但不確定信息的含義。 我認為dword暗示了大小,也許ptr ebp-40h指向一個地址。 有沒有辦法可以在Visual Studio中查看所有地址,也可以通過查看范圍來收集大小?

我知道在這樣一個簡短的論壇中回答這些問題很難,但感謝您的幫助。

您可以使用sizeof(T)來獲取原始值類型和非引用類型的大小。 對於其他類型,獲取大小可能非常困難,因為引用類型通常沒有固定大小。

這可能是簡單類型之外的復雜問題(根據下面的討論),但通常,如果類型的大小未由其數據結構明確定義,因為它本身是引用類型,或者它是包含引用類型的結構,那么就沒有辦法計算存儲空間(因為根據定義,它不是固定的)。

tl; dr: sizeof(YourType)應該給你“答案”,但Marshal.SizeOf可能更合適。

說明:

這並不總是奏效。 C#不喜歡你打破它的抽象障礙,因此它只允許你找到結構的“大小”,如果結構在托管和非托管代碼中具有相同的大小 (或者更准確地說,是“blittable”)。 否則,C#聲稱,“為什么你關心托管大小?它對你沒用”,並且不允許你采用托管類型的sizeof

有辦法繞過這個(通過直接的MSIL生成),但如果你實際上想要同一個對象的非托管表示的大小,那么你可能想要使用Marshal.SizeOf sizeof實際上並沒有看起來那么有用 - 它更方便。

還有一個硬核SOS選項,它將為您提供對象大小的真實值。

使用!ObjSize命令

==Immediate Window==
.load sos
!ObjSize <address>

您可能需要四處尋找對象的地址。 檢查!Dump*命令,例如!DumpHeap!DumpStack

我不確定我是否理解它,但是有一個運算符sizeof()

Console.WriteLine(sizeof(byte));

還有一個與引用類型相關的答案: 使用C#獲取字段大小(以字節為單位)

我很確定你所要求的是某種數據類型消耗了多少內存? 我會使用sizeof()方法,所以:

int a = 2;

你可以找到一個int占用多少空間:

Console.WriteLine(sizeof(int);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM