2011-04-17 65 views
7

在Java中,一个空字符串是40个字节。在Python中它是20个字节。 C#中的空字符串对象有多大?我不能做sizeof,我不知道如何找出答案。谢谢。sizeof空字符串在C#

回答

9

It's 18 bytes:存储

16字节+2每字符的字节分配+ 2个字节的最后空字符。

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

m_ArrayLength场在.NET 4.0中移除(你可以看到这个参考源)

+0

任何方式来测试这个?我究竟如何以编程方式发现? – 2011-04-17 02:02:40

+0

您可以使用WinDBG。 – SLaks 2011-04-17 02:03:13

+0

或64位系统上的26个字节,并且不要忘记对齐。 – Random832 2011-04-17 02:05:46

3

乔恩斯基特最近关于这一主题写了一整article

在x86上,一个空字符串为16个字节,在x64这是32个字节

+0

@SLaks谈到的空字符怎么样?这是必要的吗? – 2011-04-17 02:08:57

+0

@Dervin Thunk,不知道...阅读文章以获取更多详细信息;) – 2011-04-17 02:10:27

+1

16字节对于.NET 4.0 x86是正确的,零终止符适用。最多三个字符,下一个较大的字符串是一个包含4个字符,20个字节的字符串。单声道最有可能是4个字节。 – 2011-04-17 02:32:11

5

的CLR版本的问题。在.NET 4之前,一个字符串对象有一个额外的4字节字段,用于存储“容量”m_arrayLength字段。该字段不在.NET 4中。它具有标准对象头,4个字节用于同步块,4个字节用于方法表指针。然后4个字节存储字符串长度(m_stringLength),然后每个字符存储2个字节。和一个0字符,以使其与本机代码兼容。对象总是4个字节的倍数,最小16个字节。

因此,一个空字符串是4 + 4 + 4 + 2 = 14个字节,在.NET 4.0上四舍五入为16个字节。早期版本为20字节。给定的值是x86。这在调试器中非常明显,请检查提示this answer

+0

欣赏它,谢谢。你为什么说“最有可能的单声道将有4个字节”? – 2011-04-17 02:51:43

+0

因为它基于SSCLI20,而SSCLI20又基于版本2 CLR的源代码。 – 2011-04-17 02:59:37

+0

那么'm_arrayLength'还在吗?大概是 – 2011-04-17 03:01:06