我想加深对数据类型的理解,并想知道如何确定数据类型的大小。我希望通往答案的旅程能够揭示其他未知因素。
我知道在.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中查看所有地址,也可以通过查看范围来收集大小?
我知道在这样一个简短的论坛中回答这些问题很难,但感谢您的帮助。
答案 0 :(得分:8)
您可以使用sizeof(T)
来获取原始值类型和非引用类型的大小。对于其他类型,获取大小可能非常困难,因为引用类型通常没有固定大小。
这可能是简单类型之外的复杂问题(根据下面的讨论),但通常,如果类型的大小未由其数据结构明确定义,因为它本身是引用类型,或者它是一个结构,包含引用类型,则无法计算存储(因为根据定义,它不是固定的)。
答案 1 :(得分:4)
tl; dr: sizeof(YourType)
应该为您提供“答案”,但Marshal.SizeOf
可能更合适。
总是不起作用。 C#不喜欢你打破它的抽象障碍,所以只有 才能让你找到结构的“大小”,如果在托管和非托管代码中结构具有相同的大小 (或者,更准确地说,是“快速的”)。否则,C#声称,“你为什么关心托管大小?这对你没用”,并且不允许你使用托管类型的sizeof
。
有很多方法可以解决这个问题(通过直接的MSIL生成),但是如果你实际上想要同一个对象的非托管表示的大小,那么你可能想要使用{{1相反。 Marshal.SizeOf
实际上并不像看起来那么有用 - 它更方便。
答案 2 :(得分:2)
还有一个硬核SOS选项,它可以为您提供对象大小的真实值。
使用!ObjSize
命令
==Immediate Window==
.load sos
!ObjSize <address>
您可能需要四处寻找对象的地址。检查!Dump*
命令,例如!DumpHeap
和!DumpStack
。
答案 3 :(得分:1)
我不确定我是否理解它,但是有一个运算符sizeof()。
Console.WriteLine(sizeof(byte));
还有一个与参考类型相关的答案:Getting the size of a field in bytes with C#
答案 4 :(得分:1)
我很确定您所要求的是某种数据类型消耗的内存量是多少?我会使用sizeof()方法,因此:
int a = 2;
你可以找到一个int占用多少空间:
Console.WriteLine(sizeof(int);