如何确定.NET中的数据类型有多大?

时间:2012-06-20 19:00:43

标签: c# memory types

我想加深对数据类型的理解,并想知道如何确定数据类型的大小。我希望通往答案的旅程能够揭示其他未知因素。

我知道在.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中查看所有地址,也可以通过查看范围来收集大小?

我知道在这样一个简短的论坛中回答这些问题很难,但感谢您的帮助。

5 个答案:

答案 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);