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

Ran*_*ngy 7 .net memory string .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.发生了什么?是否还有另一轮内存对齐?

Jon*_*eet 7

怀疑第一个字符在x64上的8字节边界上对齐,因此当作为指向非托管代码的指针传递时,它是一个正确对齐的指针.你的数字肯定适合最近测量的字符串大小,导致公式:

32 bit: 14 + length * 2 (rounded up to 4 bytes) 
64 bit: 26 + length * 2 (rounded up to 8 bytes)
Run Code Online (Sandbox Code Playgroud)

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