字符串在x64中占用多少字节?

时间:2018-03-28 18:35:32

标签: c# string memory clr

为了学习,我试图理解C#字符串是如何内部存储在内存中的。

根据这个blog post,C#字符串大小为(x64 with .NET framework 4.0):

26 + 2 * length

包含单个字符的字符串将占用(26 + 2 * 1) / 8 * 8 = 32 bytes。 这确实与我测量的相似。

让我感到困惑的是那个26字节的开销。

我运行了以下代码并检查了内存:

string abc = "abcdeg";
string aaa = "x";
string ccc = "zzzzz";

enter image description here

AFAIK这些街区如下:

  • 绿色:同步块(8个字节)
  • 青色:输入信息(8个字节)
  • 黄色:长度(4个字节)
  • 粉红色:实际字符:每个字符2个字节+ 2个字节,用于NULL终止符。

查看“x”字符串。它确实是32个字节(按计算)。

无论如何,如果用零填充,它看起来像字符串的结尾。 “x”字符串可能在NULL终止符的两个字节之后结束,并且仍然是内存对齐的(因此是24字节)。 为什么我们需要额外的8个字节?

我已经尝试过与其他(更大)字符串大小相似的结果。 它看起来总是有8个字节。

1 个答案:

答案 0 :(得分:0)

正如Hans Passant建议的那样,在字符串对象的末尾添加了一个额外的字段,即4个字节(在x64中,它可能需要额外的4个字节,用于填充)。

所以最后我们有:

= 8 (sync) + 8 (type) + 4 (length) + 4(extra field) + 2 (null terminator) + 2 * length 
= 26 + 2 * length

所以Jon Skeet的博客文章是对的(怎么会出错?)