gpt4 book ai didi

.net - .NET 将 String 值放在哪里?

转载 作者:行者123 更新时间:2023-12-03 22:13:22 25 4
gpt4 key购买 nike

我正在使用 SOS 调试扩展 dll 来检查 String 类型的内存布局,以下是结果。

!dso

ESP/REG  Object   Name

0015EFC0 01c6b9cc System.String hello,world

!do 01c6b9cc
Name:        System.String

MethodTable: 6de3f9ac

EEClass: 6db78bb0

Size: 36(0x24) bytes

File: C:\Windows\Microsoft.Net\assembly\GAC_32\mscorlib\v4.0_4.0.0.0__b77a5c561934e089>\mscorlib.dll

String: hello,world

Fields:
MT Field Offset Type VT Attr Value Name

6de42978 40000ed 4 System.Int32 1 instance 11 m_stringLength

6de41dc8 40000ee 8 System.Char 1 instance 68 m_firstChar

6de3f9ac 40000ef 8 System.String 0 shared static Empty

>> Domain:Value 00331488:01c61228 <<

现在我想知道,字符串值“hello world”究竟存储在哪里?

谢谢。

最佳答案

在 m_firstChar。堆分配足够大以适合整个字符串,而不仅仅是第一个字符。在 Visual Studio 中也很容易看到:

class Program {
static void Main(string[] args) {
string s = "hello" + "world";
} // <=== Breakpoint here
}

当断点命中时,使用 Debug + Windows + Memory + Memory1。在地址框中键入 s。你会看到的:
0x01B3F6BC  e8 0a 67 6e 0b 00 00 00 0a 00 00 00 68 00 65 00  è.gn........h.e.
0x01B3F6CC 6c 00 6c 00 6f 00 77 00 6f 00 72 00 6c 00 64 00 l.l.o.w.o.r.l.d.
  • 对象从地址 - 4 开始,syncblk 存储在那里(不可见)。
  • 接下来的 4 个字节是方法表指针(0x6e670ae8,又名类型句柄)。
  • 接下来的 4 个字节是 m_arrayLength 成员,分配的字符串大小 (0x0b)。
  • 接下来的 4 个字节是 m_stringLength 成员,字符串中的实际字符数 (0x0a)。
  • 下一个字节存储字符串,从 m_firstChar 开始。

  • 这适用于 .NET 3.5 SP1。您不会在 .NET 4.0 及更高版本中看到 m_arrayLength 成员,该字段已被删除。

    关于.net - .NET 将 String 值放在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5240971/

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