我一直试图弄清楚.NET 4 x64中字符串的开销。这就是我到目前为止所做的。
所以你希望1个字符的字符串是16 + 4 + 4 = 24个字节。它可以被8整除,所以它不需要任何填充。
但是当我查看WinDbg中的大小时,我发现它们 32字节。当我!dumpobject
时,他们说他们的大小是28个字节,这就是我假设被调整到32个。这是怎么回事?是否还有另一轮内存对齐?
答案 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类的内部结构布局知识的代码中执行任何操作都是危险的。