为了学习,我试图理解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";
afaik这些模块如下:
绿色:同步块(8字节)
青色:类型信息(8字节)
黄色:长度(4字节)
粉色:实际字符:每个字符2个字节+空终止符2个字节。
看看“x”字符串。它实际上是32字节(按计算)。
不管怎样,如果用零填充,它看起来像字符串的结尾。
对于空终止符,“x”字符串可能会在两个字节之后结束,并且仍然是内存对齐的(因此是24个字节)。
为什么我们需要额外的8字节?
我用其他(更大)尺寸的绳子做了类似的实验。
看起来总是有一个额外的8字节。
最佳答案
正如HansPassant建议的那样,在字符串对象的末尾添加了一个额外的字段,它是4个字节(在x64中,它可能需要另外4个字节来填充)。
所以最后我们有:
= 8 (sync) + 8 (type) + 4 (length) + 4(extra field) + 2 (null terminator) + 2 * length
= 26 + 2 * length
所以乔恩·斯基特的博客是对的(怎么可能是错的?)