4

默认情况下,C# 中的结构[StructLayout( LayoutKind.Sequential )]的实现原因基本上是说明这些类型的对象通常用于 COM 互操作,并且它们的字段必须保持它们定义的顺序。类已LayoutKind.Auto定义。

我的问题是我是否应该明确声明我的结构,[StructLayout( LayoutKind.Auto )]这是否会给我带来任何优于默认设置的好处?我的意思是,如果结构是在stack上初始化的,它会有什么不同——即GC不必移动它们吗?当结构在堆上初始化时也会有帮助 - 即是某个类的一部分吗?

4

2 回答 2

2

我能想到的唯一可能的好处是你的结构占用更少的内存。但是如果你一开始就有这么大的结构,你可能应该将它重构为一个类。

一个潜在的问题是你想把你struct编入一个byte[]using Marshal.PtrToStructure,你怎么能保证字节的顺序和你期望的一样?

这样做似乎你引入的可能问题比你要解决的问题多......话虽如此,如果字段的顺序对你来说并不重要,那就去做吧,但请记住下一个来的人一个人可能不会期待它。

于 2009-11-29T20:09:27.067 回答
1

它可能会给你带来好处,尽管我认为它不会有太大作用。我通常坚持默认设置。

基本上,使用自动布局,CLR 可以选择如何对齐数据,因此可能会为速度做出一些空间权衡(这也取决于平台,保持对齐在某些情况下可能比在其他情况下更重要)。但是,由于结构也经常在堆栈上使用或作为复合辅助结构(想想 KeyValuePair),因此顺序通常在默认情况下是有意义的。

于 2009-11-29T20:40:07.320 回答