任何人都可以告诉我下面的字符串会占用多少字节?
string abc = "a";
答案 0 :(得分:33)
来自我的article on strings:
至少在当前的实现中,字符串占用20+(n / 2)* 4字节(向下舍入n / 2的值),其中n是字符串中的字符数。字符串类型的不寻常之处在于对象本身的大小各不相同。执行此操作的唯一其他类(据我所知)是数组。本质上,字符串是内存中的字符数组,加上数组的长度和字符串的长度(以字符为单位)。数组的长度并不总是与字符长度相同,因为字符串可以在mscorlib.dll中“过度分配”,以便更容易构建它们。 (例如,StringBuilder执行此操作。)虽然字符串对外部世界是不可变的,但mscorlib中的代码可以更改内容,因此StringBuilder创建一个字符串,其内部字符数组比当前内容所需的更大,然后追加到该字符串,直到字符数组不再大到可以处理,此时它会创建一个具有更大数组的新字符串。字符串长度成员的顶部位还包含一个标志,表示该字符串是否包含任何非ASCII字符。这允许在某些情况下进行额外的优化。
我怀疑这是在我有机会使用64位CLR之前编写的;我怀疑在64位上每个字符串占用4或8个字节。
编辑:我最近写了一篇blog post,其中包括64位信息(并且与x86的上述内容略有矛盾......)
答案 1 :(得分:10)
基本上,每个字符串对象都需要一个20字节的常量对象数据。 缓冲区每个字符需要2个字节。 字符串的内存使用估计值:20 +(2 * Length)。 因此,正常情况下CLR中此字符串的内存:22个字节
然而,当我们将此字符串传递或发送到另一端或任何其他用途时,我们不需要这么多内存(我们从不需要对象数据的20个字节)。因此,当您使用它时,它取决于您选择的编码类型。
对于默认编码,字符需要1个字节。
因此,默认编码的答案是1个字节。
您可以查看以下代码:
Encoding.Default.GetBytes("a"); //It will give you a byte array of size 1.
Encoding.Default.GetBytes("ABC"); //It will give you a byte array of size 3.
答案 2 :(得分:1)
如果你询问string
对象的大小,那么询问它的大小是错误的,没有调试器就不可能说出它到底是什么。不确定调试器是否可行。 string
在内部使用指针。
如果你询问它包含的字符序列的大小,那么它是4,因为字符串以UTF-16存储。基本多语言平面中的所有字符都用两个字节编码。