代码之家  ›  专栏  ›  技术社区  ›  Dan Tao

可为空的<Int32>的大小是多少?

  •  11
  • Dan Tao  · 技术社区  · 15 年前

    实际上,有几个问题:

    1. int ( Int32 int? ( Nullable<int>
    2. 我会用英语回答我自己的问题 sizeof(int?) 内景? sizeof -好像手术会误导人。但是,在当前环境下,有没有办法获得托管类型的“基线”大小(即,新实例化实例的大小是多少)?
    4 回复  |  直到 15 年前
        1
  •  6
  •   Richard    15 年前

    你可以进去看看 ildasm

    If有两个字段:a bool T ,所以可能是8字节(假设4字节对齐)。

        2
  •  7
  •   Hans Passant    15 年前

    但既然你这么做了:最小大小是0字节。当JIT优化器将值保存在CPU寄存器中时,您将得到这个值。下一个大小是2字节,对于bool?字节呢?,1字节表示HasValue,另一个字节表示值。因为局部变量必须与一个4的倍数的地址对齐。额外的2字节填充将永远不会被使用。

    等等。您可以通过编写这样的代码来发现这一点:

            int front = 42;
            bool? center = null;
            int back = 43;
            Console.WriteLine("", front, center, back);
    

    用调试器查看机器代码指令。注意ebp寄存器偏移量。当心那堆东西会往下长。

        3
  •  2
  •   Jay    15 年前

    我找到了解决这个问题的方法 here ,其中包含用于测试内存使用情况的简单控制台应用程序的代码。

    基本上,

    包装器需要4字节的存储空间

        4
  •  0
  •   STO    15 年前

    考虑 Marshal.SizeOf 方法。它允许获取托管值类型的大小。这很奇怪,但看起来可为null类型的大小等于其类型参数的大小(int的大小?等于int的大小等)