值类型的最大建议大小是多少?我想我读过微软建议它们不超过16个字节,但我找不到参考。
答案 0 :(得分:4)
是的,Microsoft确实建议struct
不要超过16个字节。
答案 1 :(得分:2)
我在MSDN上发现了一个讨论和宽松的建议,"Using Classes and Structures in Visual Basic .NET":
如果您的应用程序生成大量变量副本,则该变量所需的内存可以是确定它应该是值类型还是引用类型的因素。复制值类型的所有字节与在堆上分配新的引用类型之间存在权衡。应用程序变量的副本越多,这种区别就越重要。
理论观察可以作为初步指导。假设您编写了一个执行以下操作的测试应用程序:
[..]
根据执行平台和其他任务的加载,您可能会发现以下情况:
- 如果公共数据大小小于16个字节,则结构实例复制循环可能比类实例复制循环稍快。
- 如果数据大小为16字节,则循环可能在时间上大致相等。
- 如果数据大小超过16个字节,则类循环可能会更快。
后来,Choosing Between Classes and Structures更加明确:
除非类型具有以下所有特征,否则不要定义结构:
- 它逻辑上表示单个值,类似于基本类型(整数,双精度等)。
- 实例大小小于16个字节。
- 这是不可改变的。
- 不必频繁装箱。
答案 2 :(得分:0)
复制17字节或更大的值类型比复制16字节或更小的值要长得多;因此,Microsoft指南的作者建议结构应小于16个字节。但事实上,在许多情况下,较大的结构可能完全合适。
在决定是使用结构还是不可变类时,应该注意某些操作在每个操作上都更快。在需要许多存储位置(变量,数组元素或其他)来保存完全相同的信息的情况下,不可变类类型非常有效。一个人简单地创建一个保存信息的对象,然后将引用存储到应该保存该信息的每个存储位置;存储引用的成本等于存储四个或八个(对于32/64位系统)字节结构的成本。存储较大的结构会相应较慢。
不可变类型表现不佳,但是,如果经常会有一个存储位置保存一些数据并将其更改为存储略有不同数据的存储位置。在这种情况下,exposed-field结构类型通常是理想的。对这种存储位置进行轻微更改的成本非常低,并且取决于更改的性质,而不是结构的大小。相比之下,对不可变类类型的存储位置进行小的更改通常需要创建一个新的类对象,其状态主要是从旧的类复制,但需要进行任何更改。这个成本与班级的大小成正比,加上大量的开销。
如果一个结构的代码最小化结构被复制的次数,那么即使是大型结构也非常有效。尽管17字节结构比16字节结构慢,但是可变的100字节结构仍然比等效的不可变类更有效。