为什么选择LayoutKind.Auto作为引用类型,选择LayoutKind.Sequential作为值类型?

时间:2011-04-02 09:26:30

标签: c# clr


   这是我遇到的问题。
   CLR via C#, Third Edition说:“您应该知道Microsoft的C#编译器选择LayoutKind.Auto作为参考 类型(类)和LayoutKind.Sequential用于值类型(结构)。“LayoutKind.AutoLayoutKind.Sequential之间有什么区别?为什么CLR可以通过排列类型的字段来提高性能?
谢谢

1 个答案:

答案 0 :(得分:1)

编译器可能能够通过将通常一起访问的字段排列在一起(例如在循环内)来提高缓存性能,因此它们最终位于同一缓存行中。

更新:另一个更大的优化潜力是成员的对齐。例如,byte可以是1字节对齐,而int通常是4字节对齐。所以考虑:

byte b1;
int i1;
byte b2;
int i2;

在将整数对齐为4字节时,您可能会浪费3个字节的空间:

b1  0  0  0
i1 i1 i1 i1
b2  0  0  0
i2 i2 i2 i2

重新排序

i1 i2 b1 b2

编译器可以减少浪费:

i1 i1 i1 i1
i2 i2 i2 i2
b1 b2  0  0

因此只需要12个而不是16个字节。

这取决于所使用的CPU架构是否带来性能优势。大多数32位RISC处理器就像它们的32位数据一样对齐。