这是我遇到的问题。
CLR via C#, Third Edition说:“您应该知道Microsoft的C#编译器选择LayoutKind.Auto作为参考
类型(类)和LayoutKind.Sequential用于值类型(结构)。“LayoutKind.Auto和LayoutKind.Sequential之间有什么区别?为什么CLR可以通过排列类型的字段来提高性能?
谢谢
答案 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位数据一样对齐。