gpt4 book ai didi

c# - 为什么 WinDbg 将 System.Int32 变量显示为 24 个字节?

转载 作者:行者123 更新时间:2023-11-30 14:49:57 24 4
gpt4 key购买 nike

我正在使用 WinDbg 分析 .NET 进程的内存转储,我注意到它将堆上所有 System.Int32 变量的大小报告为 24 字节。下面是对其中一个变量的相关 DumpObj 调用的示例:

0:000> !DumpObj /d 00000061c81c0e80
Name: System.Int32
MethodTable: 00007fff433f37c8
EEClass: 00007fff42e30130
Size: 24(0x18) bytes
File: C:\Windows\Microsoft.Net\assembly\GAC_64\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll
Fields:
MT Field Offset Type VT Attr Value Name
00007fff433f37c8 4000456 8 System.Int32 1 instance 141 m_value

据我所知,System.Int32 的大小应该是 4 个字节。这种差异的根源是什么?

最佳答案

堆上的任何对象都有开销。在 32 位 MS.NET 运行时,这是 8 个字节,在 64 位,16 个字节(免责声明:这不是严格的契约(Contract),将来可能会更改或在符合规范的实现中更改.NET 运行时)。

因为您的 int 是装箱的,所以它将有 16 字节的开销。所以您可能期望总共使用 20 个字节。好吧,除了在 64 位系统上,对象(和结构)被填充到 8 字节边界,所以实际上每个 int 得到 24 字节。

相比之下,当您使用包含 16 个整数的 struct 时,您将仅使用 16 + 4 * 16 = 80 字节的内存,每个整数总共使用 5 个字节。

再说一次,其中大部分是实现细节,所以不是您可以依赖的东西;如果需要,有效的 .NET 运行时完全有可能将单个 int 存储在 1 MiB 的内存中,并且它也可以将其存储在一些紧凑的表示形式中或使用实习,只要它符合该类型的所有契约行为。即使与实际的 MS 运行时实现相比,它也非常简化 - 例如,如果您的对象足够大,它将需要更多的开销。

关于c# - 为什么 WinDbg 将 System.Int32 变量显示为 24 个字节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38056513/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com