int
(Int32
)的内存占用为4个字节。但是内存占用的是什么:
int? i = null;
和:
int? i = 3;
这是一般的还是类型依赖的?
答案 0 :(得分:17)
我不是100%肯定,但我相信它应该是8字节,int32的4个字节,并且(因为每个东西必须在32位机器上对齐4个字节)4个字节用于布尔指示是否指定了整数值。
在64位机器上它仍然是8字节(64位),因为这是可以寻址的最小内存块...
答案 1 :(得分:11)
Nullable<T>
的大小绝对取决于类型。该结构有两个成员
结构的大小通常会映射到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位计算机:
可空类型包装器需要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个字节