C#中空字符串的大小

8
在Java中,空字符串占用40字节。在Python中,它占用20字节。在C#中,空字符串对象有多大?我不能使用sizeof,也不知道如何找到答案。谢谢。
3个回答

9

这是18个字节

16个字节用于内存+每个字符分配2个字节+用于最后的空字符2个字节。

请注意,这是关于.Net 1.1编写的。

在.Net 4.0中已移除m_ArrayLength字段(您可以在参考源代码中查看)。


有什么方法可以测试这个吗?我该如何以编程的方式找出来? - Dervin Thunk
在64位系统上是26个字节,别忘了对齐。 - Random832
1
@Random:在64位系统上,如何有任何东西占用26个字节?26个字节甚至不是32位系统的有效大小。 - Gabe
1
它不再适用于.NET 4.0。对象大小始终是4的倍数,因此为20字节。 - Hans Passant
我指的是对齐填充之前的大小。(而且,在64位系统上它们总是8的倍数吗?) - Random832
显示剩余2条评论

6
CLR版本很重要。在.NET 4之前,字符串对象有一个额外的4字节字段,用于存储“容量”,即m_arrayLength字段。在.NET 4中,该字段已经不存在了。它具有标准对象头,4个字节用于同步块,4个字节用于方法表指针。然后是4个字节来存储字符串长度(m_stringLength),接下来每个字符使用2个字节。最后加上一个0字符以使其与本地代码兼容。对象始终是4字节的倍数,最小为16字节。
因此,空字符串在.NET 4.0上是14字节,向上取整为16字节。在早期版本上为20字节。给定的值是针对x86的。在调试器中非常明显,请参考this answer获取提示。

感谢您。为什么您说“很可能Mono会有4个额外的字节”? - Dervin Thunk
因为它是基于 SSCLI20 构建的,而 SSCLI20 又是基于版本2 CLR的源代码构建的。 - Hans Passant
那么 m_arrayLength 还在吗? - Dervin Thunk
大概吧。获取Mono的源代码很容易,如果调试器没有帮助,为什么不看一下呢? - Hans Passant

3

Jon Skeet最近写了一篇关于这个主题的完整文章

在x86上,空字符串占用16字节,在x64上则为32字节。


@SLaks所提到的空字符怎么样?那是必要的吗? - Dervin Thunk
@Dervin Thunk,不知道...请阅读文章了解更多细节 ;) - Thomas Levesque
1
16字节对于.NET 4.0 x86是正确的,零终止符合适。最多三个字符,下一个更大的字符串是一个有4个字符,20字节的字符串。Mono可能会大4个字节。 - Hans Passant

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接