为什么x64中的1个字符的.NET字符串为32个字节?

时间:2011-10-10 18:18:58

标签: .net string memory .net-4.0

我一直试图弄清楚.NET 4 x64中字符串的开销。这就是我到目前为止所做的。

  • x64
  • 的16字节对象标头
  • stringLength字段的4个字节(在.NET 4中,arrayLength已消失)
  • (长度+ 1)*字符串内容的2个字节(UTF-16,空终止)

所以你希望1个字符的字符串是16 + 4 + 4 = 24个字节。它可以被8整除,所以它不需要任何填充。

但是当我查看WinDbg中的大小时,我发现它们 32字节。当我!dumpobject时,他们说他们的大小是28个字节,这就是我假设被调整到32个。这是怎么回事?是否还有另一轮内存对齐?

3 个答案:

答案 0 :(得分:7)

怀疑第一个字符在x64上的8字节边界上对齐,因此当作为指向非托管代码的指针传递时,它是一个正确对齐的指针。你的数字最近肯定与the ones I got measuring string size一致,导致公式为:

32 bit: 14 + length * 2 (rounded up to 4 bytes) 
64 bit: 26 + length * 2 (rounded up to 8 bytes)

因此,在64位CLR中,即使是0长度的字符串也需要32个字节。

答案 1 :(得分:1)

四舍五入到段落(16字节)边界以优化英特尔处理器上的缓存行填充?

答案 2 :(得分:0)

根据我的理解,你不能依赖.NET的实现方面的任何东西 - 只是因为它在你的机器上是x字节,并不意味着它在某些其他机器/ .NET版本上是x字节。即,在具有.NET类的内部结构布局知识的代码中执行任何操作都是危险的。