.net 可为空的大小是多少<;Int32>;?
实际上,有几个问题:.net 可为空的大小是多少<;Int32>;?,.net,int,nullable,sizeof,boolean,.net,Int,Nullable,Sizeof,Boolean,实际上,有几个问题: int(Int32)被指定为(显然)32位。一个int?(Nullable)呢?我的直觉告诉我,整数是32位,布尔值是8位,但实现可能比这更复杂 我会用sizeof(int?)回答我自己的问题;但由于int?是托管类型,因此这是不允许的。我理解类型的大小可能取决于平台,如果对象包含对其他对象的引用,则类似于sizeof的操作会产生误导。但是,在当前环境下,有没有办法获得托管类型的“基线”大小(即新实例化实例的大小是多少) 您可以查看ildasm或Reflector If有两
int
(Int32
)被指定为(显然)32位。一个int?
(Nullable
)呢?我的直觉告诉我,整数是32位,布尔值是8位,但实现可能比这更复杂sizeof(int?)
回答我自己的问题;但由于int?
是托管类型,因此这是不允许的。我理解类型的大小可能取决于平台,如果对象包含对其他对象的引用,则类似于sizeof
的操作会产生误导。但是,在当前环境下,有没有办法获得托管类型的“基线”大小(即新实例化实例的大小是多少)您可以查看
ildasm
或Reflector
If有两个字段:a
bool
和aT
,所以可能有8个字节(假设4个字节对齐)。考虑方法。它允许获取托管值类型的大小。这很奇怪,但看起来可空类型的大小等于其类型参数的大小(size of int?等于size of int,等等)。我找到了一种处理方法,正好解决了这个问题,其中包括用于测试内存使用情况的简单控制台应用程序的代码
基本上
…这表示可为null的类型
包装器需要4字节的存储空间
永远不要问这样的问题是很重要的,因为你不会得到一个直接的答案 但既然您已经这样做了:最小大小是0字节。当JIT优化器设法将值保存在CPU寄存器中时,您将得到该值。下一个大小是2字节,对于bool?字节?,1个字节表示HasValue,另一个字节表示值。因为局部变量必须与一个4的倍数的地址对齐,所以很少会得到。额外的2字节填充将永远不会被使用 下一个尺码是3号?和char?,现在将获得1字节的填充 大跃进到下一个,int?需要5个字节,但填充将其增加到8个字节 等等。您可以通过编写以下代码来了解这一点:
int front = 42;
bool? center = null;
int back = 43;
Console.WriteLine("", front, center, back);
并使用调试器查看机器代码指令。注意ebp寄存器偏移量。而且要注意堆栈会变小。很好,从这个堆栈中学到了一些新东西!这完全有道理,但我没有考虑对齐问题(我想这是游戏后期进入软件开发时发生的情况,没有CS教育)。AFAIK的可能副本您无法封送可为空的值。因此,您得到的数据不正确。Microsoft文档中说:“对象的非托管和托管大小可能不同。”-因此此方法不可靠。