Nullable <t> </t>的内存占用量是多少

时间:2009-09-04 20:08:17

标签: c# .net memory nullable

intInt32)的内存占用为4个字节。但是内存占用的是什么:

int? i = null;

和:

int? i = 3;

这是一般的还是类型依赖的?

8 个答案:

答案 0 :(得分:17)

我不是100%肯定,但我相信它应该是8字节,int32的4个字节,并且(因为每个东西必须在32位机器上对齐4个字节)4个字节用于布尔指示是否指定了整数值。

在64位机器上它仍然是8字节(64位),因为这是可以寻址的最小内存块...

答案 1 :(得分:11)

Nullable<T>的大小绝对取决于类型。该结构有两个成员

  • 布尔值:对于hasValue
  • value:用于基础值

结构的大小通常会映射到4加上类型参数T的大小。

答案 2 :(得分:4)

            int? a = 3;
  00000038  lea         ecx,[ebp-48h] 
  0000003b  mov         edx,3 
  00000040  call        78BFD740 
  00000045  nop              
            a = null;
  00000046  lea         edi,[ebp-48h] 
  00000049  pxor        xmm0,xmm0 
  0000004d  movq        mmword ptr [edi],xmm0 

似乎第一个dword是值,第二个是null标志。所以,总共8个字节。

好奇,BinaryWritter不喜欢写可空类型。我徘徊,如果它可以收紧它,然后8字节......

答案 3 :(得分:1)

.NET(以及大多数其他语言/框架)的默认行为是将结构体字段与其大小的倍数对齐,并将自身结构体与其最大字段大小的倍数对齐。参考:StructLayout

Nullable<T> 有一个 bool 标志和 T 值。由于 bool 只占用 1 个字节,所以最大字段的大小就是 T 的大小;与单独的 T 相比,Nullable 所需的空间翻了一番。参考:Nullable Source

澄清:如果 T 本身是一个非原始结构体而不是原始类型,Nullable 会增加 T 内最大原始字段的大小所需的空间,或者递归地,在任何 T 内非原始字段。因此,Nullable<Nullable<bool>> 的大小是 3,而不是 4。

答案 4 :(得分:0)

int?是一个包含布尔值hasValue和int的结构。因此,它具有5个字节的占用空间。这同样适用于nullable<T>size = sizeof(T)+sizeof(bool)

的所有实例

答案 5 :(得分:0)

可空类型是一个包含常规变量和空状态标志的结构。

对于一个可以为空的int,这意味着它包含五个字节的数据,但它当然填充到完整的单词,所以它使用了八个字节。

您通常可以预期任何可空类型将比常规类型大四个字节,除了像byte和boolean这样的小类型。

答案 6 :(得分:0)

32位和64位计算机:

  • int == 4个字节
  • int? == 8个字节 == 4表示int + 4表示可空类型包装器。
  

可空类型包装器需要4个字节的存储空间。和整数   本身每个元素需要4个字节。这是一个有效的   实施。在数组中,许多可为空的类型存储在   连续内存。

基于个人测试(.NET Framework 4.6.1,x64,发行版)并且来自– http://doc.qt.io/qt-5/designer-using-a-ui-file.html

此外,如果有意思的话:https://www.dotnetperls.com/nullable-memory

注意:这仅对Nullable<int>有效,Nullable<T>的大小完全取决于类型。

答案 7 :(得分:0)

您可以使用一些类似于https://www.dotnetperls.com/nullable-memory的代码进行检查。

我得到以下结果:

  • Int32 4个字节
  • Int32? 8个字节
  • Int16 2个字节
  • Int16? 4个字节
  • Int64 8个字节
  • Int64? 16字节
  • Byte 1个字节
  • Byte? 2个字节
  • bool 1个字节
  • bool? 2个字节