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

Posted

技术标签:

【中文标题】如何确定 .NET 中的数据类型有多大?【英文标题】:How do I determine how big a data type is in .NET? 【发布时间】:2012-06-20 19:00:42 【问题描述】:

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

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

static void Main(string[] args)

byte b = 1;

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

mov         dword ptr [ebp-40h],1

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

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

您的答案措辞很差/误导性......它写的不正确(尽管已经知道答案的人可以看到您的意思)。 struct MyValueType object o; --> sizeof(MyValueType)? 此外,它不仅没有固定大小,而且仍然不会即使您只是嵌入“原始”类型:struct S IntPtr p; 肯定有大小(托管和非托管),也不是固定大小。 也许您应该发布一个详细的答案来解释平台特定类型的细微差别?我相信准确性很重要,但 OP 基本上是在询问如何获得 byte 的大小。他正在寻找的答案实际上是sizeof,我尝试(但失败)用几句话解释为什么它并不总是有效。我会投票给一个更好的答案。 @Mehrdad,你绝对值得拥有这个。但我需要更多的代表:)【参考方案2】:

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

说明:

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

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

【讨论】:

也感谢您的 Mehrdad。我发现这篇文章有助于解释这一点,codeproject.com/Articles/97711/sizeof-vs-Marshal-SizeOf。我没有进行任何非托管开发,这纯粹是我试图摆脱 .NET 的帮助。【参考方案3】:

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

使用!ObjSize 命令

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

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

【讨论】:

【参考方案4】:

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

Console.WriteLine(sizeof(byte));

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

【讨论】:

【参考方案5】:

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

int a = 2;

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

Console.WriteLine(sizeof(int);

【讨论】:

以上是关于如何确定 .NET 中的数据类型有多大?的主要内容,如果未能解决你的问题,请参考以下文章

mysql 数据库可以有多大

什么是字节?一个字节有多大啊?

base64加密后有5000个字节。文件有多大

500w 的引用类型和值类型到底有多大差异?

顺序表

解析隐式类型转换操作operator double() const,带你了解隐式转换危害有多大