7

我想加深对数据类型的理解,想知道如何确定数据类型有多大。我希望找到答案的旅程能发现其他未知数。

我知道在 .NET 中,一个字节是一个 8 位无符号整数,但这只是因为我读过它。如果我有一个非常简单的控制台应用程序,如下所示:

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

如何在 Visual Studio 中判断“b”的数据结构有多大?我看到有一些内存诊断窗口,但它只说当我跳过 b 的分配时它们无法评估表达式。我打开了反汇编窗口,可以看到 mov 操作...

mov         dword ptr [ebp-40h],1

...但不确定信息的含义。我认为 dword 暗示了大小,也许 ptr ebp-40h 指向了一个地址。有没有一种方法可以让我在 Visual Studio 中查看所有地址,并通过查看范围来收集大小?

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

4

5 回答 5

8

您可以使用sizeof(T)来获取原始值类型和非引用类型的大小。对于其他类型,获取大小可能非常困难,因为引用类型通常没有固定大小。

这可能是简单类型之外的一个复杂问题(根据下面的讨论),但通常,如果类型的大小没有由其数据结构明确定义,因为它本身就是引用类型,或者它是包含引用类型的结构,那么就无法计算存储(因为根据定义,它是不固定的)。

于 2012-06-20T19:02:31.177 回答
4

tl; dr: sizeof(YourType)应该给你“答案”,但Marshal.SizeOf可能更合适。

解释:

这并不总是有效的。C# 不喜欢你打破它的抽象障碍,所以它只让你找到结构的“大小”,如果结构在托管和非托管代码中具有相同的大小(或者更准确地说,是“blittable”)。否则,C# 声称,“你为什么关心托管大小?它对你没用”,并且不允许你采用sizeof托管类型。

有一些方法可以解决这个问题(通过直接生成 MSIL),但如果您实际上想要同一对象的非托管表示的大小,那么您可能想要Marshal.SizeOf改用它。sizeof实际上并没有看起来那么有用——它只是更方便。

于 2012-06-20T19:13:44.247 回答
2

还有一个核心SOS选项,它将为您提供对象大小的真实值。

使用!ObjSize命令

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

您可能需要四处寻找对象的地址。检查!Dump*命令,例如!DumpHeap!DumpStack

于 2012-06-20T19:31:00.107 回答
1

我不确定我是否理解得很好,但是有一个运算符sizeof()

Console.WriteLine(sizeof(byte));

还有一个与引用类型相关的答案:Getting the size of a field in bytes with C#

于 2012-06-20T19:03:44.847 回答
1

我很确定您要的是某种数据类型消耗多少内存?我会使用 sizeof() 方法,因此:

int a = 2;

您可以找到一个 int 占用了多少空间:

Console.WriteLine(sizeof(int);
于 2012-06-20T19:09:20.267 回答