.NET 将字符串值放在哪里?

发布于 2024-10-21 08:27:41 字数 918 浏览 4 评论 0原文

我正在使用 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”到底存储在哪里?

谢谢。

I am using SOS debug extension dll to check the memory layout of a String type, and below is the result.

!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 <<

Now I am wondering, where exactly is the string value "hello world" stored?

Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

╭⌒浅淡时光〆 2024-10-28 08:27:41

在 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 成员,该字段已被删除。

At m_firstChar. The heap allocation is large enough to fit the entire string, not just the first character. Easy to see in Visual Studio as well:

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

When the breakpoint hits, use Debug + Windows + Memory + Memory1. In the Address box type s. You'll see:

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.
  • The object starts at the address - 4, the syncblk is stored there (not visible).
  • Next 4 bytes is the method table pointer (0x6e670ae8, aka type handle).
  • Next 4 bytes is the m_arrayLength member, the allocated size of the string (0x0b).
  • Next 4 bytes is the m_stringLength member, the actual number of characters in the string (0x0a).
  • Next bytes store the string, starting at m_firstChar.

This is for .NET 3.5 SP1. You won't see the m_arrayLength member in .NET 4.0 and up, the field was removed.

明天过后 2024-10-28 08:27:41

与 C“字符串”类似,它存储在从 m_firstChar 开始的 m_stringLength 字节中,这是一个不安全的指针,而不是实际的字符。不过,C# 使用长度前缀字符串而不是 null 分隔字符串。

也就是说,CLR 的美妙之处在于您无需关心。这怎么变成一个问题了?

Like a C "string", it's stored in the m_stringLength bytes starting at m_firstChar which is an unsafe pointer, not an actual character. C# uses a length prefixed string rather than a null delimited one though.

That said, the beauty of the CLR is that you don't need to care. How has this become an issue?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文