.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
    和a
    T
    ,所以可能有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文档中说:“对象的非托管和托管大小可能不同。”-因此此方法不可靠。