如何确定 .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 中的数据类型有多大?的主要内容,如果未能解决你的问题,请参考以下文章