tig*_*rou 8 c# memory string clr
出于学习的目的,我试图理解C#字符串是如何内部存储在内存中的.
根据这篇博客文章,C#字符串大小是(x64与.NET framework 4.0):
26 + 2 * length
Run Code Online (Sandbox Code Playgroud)
带有单个字符的字符串(26 + 2 * 1) / 8 * 8 = 32 bytes.这确实与我测量的相似.
让我感到困惑的是26字节的开销.
我运行了以下代码并检查了内存:
string abc = "abcdeg";
string aaa = "x";
string ccc = "zzzzz";
Run Code Online (Sandbox Code Playgroud)
AFAIK这些块如下:
看看"x"字符串.它确实是32个字节(按计算).
无论如何,如果用零填充,它看起来像字符串的结尾."x"字符串可能在NULL终止符的两个字节之后结束,并且仍然是内存对齐的(因此是24字节).为什么我们需要额外的8个字节?
我已经尝试了与其他(更大)字符串大小相似的结果.它看起来总是有8个字节.
正如 Hans Passant 所建议的,在字符串对象的末尾添加了一个额外的字段,该字段为 4 个字节(在 x64 中,可能需要另外 4 个字节用于填充)。
所以最后我们有:
= 8 (sync) + 8 (type) + 4 (length) + 4(extra field) + 2 (null terminator) + 2 * length
= 26 + 2 * length
Run Code Online (Sandbox Code Playgroud)
所以 Jon Skeet 的博客文章是对的(怎么可能是错的呢?)