gpt4 book ai didi

.net - 了解 32 位与 64 位之间的 CLR 对象大小

转载 作者:行者123 更新时间:2023-12-03 14:37:41 24 4
gpt4 key购买 nike

我试图了解 32 位和 64 位处理器之间的对象大小差异。假设我有一个简单的类

class MyClass   
{
int x;
int y;
}

所以在 32 位机器上,一个整数是 4 个字节。如果我将 Syncblock 添加到其中(另外 4 个字节),则对象大小将为 12 个字节。为什么它显示 16 个字节?

0:000> !do 0x029d8b98
名称:ConsoleApplication1.Program+MyClass
方法表:000e33b0
EEClass: 000e149c
大小:16(0x10) 字节
(C:\MyTemp\ConsoleApplication1\ConsoleApplication1\bin\x86\Debug\ConsoleApplication1.exe)
领域:
MT 字段偏移类型 VT Attr 值名称
71972d70 4000003 4 System.Int32 1 实例 0 x
71972d70 4000004 8 System.Int32 1 实例 0 y

在 64 位机器上,整数仍然是 4 个字节,唯一改变的是 Syncblock 将是 8 个字节(因为指针在 64 位机器上是 8 个字节)。这意味着对象大小将为 16 字节。为什么它显示 24 个字节?

0:000> !do 0x00000000028f3c90
名称:ConsoleApplication1.Program+MyClass
方法表:000007ff00043af8
EEClass: 000007ff00182408
大小:24(0x18)字节
(C:\MyTemp\ConsoleApplication1\ConsoleApplication1\bin\Debug\ConsoleApplication1.exe)
领域:
MT 字段偏移类型 VT Attr 值名称
000007fef4edd998 4000003 8 System.Int32 1 实例 0 x
000007fef4edd998 4000004 c System.Int32 1 实例 0 y

最佳答案

CLR 可以按照它认为合适的方式在内存中自由布置对象。这是一个实现细节。您不应依赖任何特定的布局。
您看到的差异是由于缺少 TypeHandle 字段,该字段也是 CLR 对象 header 的一部分。此外,字段可以与字节边界对齐。

来自 Advanced .Net Debugging - CLR Object’s Internal Structure :

An object’s CLR internal structure is:

[DWORD: SyncBlock][DWORD: MethodTable Pointer][DWORD: Reference type pointer]…[Value of Value Type field]…

Object Header: [DWORD: SyncBlock]
Object Pointer: [DWORD: MethodTable Pointer][DWORD: Reference type pointer]…[Value of Value Type field]…

Every Object is preceded by an ObjHeader (at a negative offset). The ObjHeader has an index to a SyncBlock.



所以你的对象很可能是这样布置的:
x86:(对齐到 8 个字节)
Syncblk 类型句柄 X Y
------------,------------|------------,------------ -|
8 16

x64:(对齐到 8 个字节)
Syncblk 类型句柄 X Y
-------------------------|------------------------ -|------------,------------|
8 16 24

另见: Drill Into .NET Framework Internals to See How the CLR Creates Runtime Objects

关于.net - 了解 32 位与 64 位之间的 CLR 对象大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3815227/

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