我现在已经读过几个地方,结构的最大实例大小应该是16个字节.
但是我看不出这个数字(16)来自哪里.
浏览网络,我发现一些人认为这是一个近似的数字表现良好,但微软说这是一个很难的上限.(例如MSDN)
有没有人有一个明确的答案为什么它是16字节?
jal*_*alf 61
这只是一个表现的经验法则.
关键是因为值类型是按值传递的,所以如果将结构传递给函数,则必须复制结构的整个大小,而对于引用类型,只需要复制引用(4个字节).结构可能会节省一些时间,因为你删除了一个间接层,所以即使它大于这4个字节,它仍然比传递引用更有效.但在某些时候,它变得如此之大,以至于复制的成本变得明显.一个常见的经验法则是,这通常发生在大约16个字节.之所以选择16是因为它是一个很好的整数,2的幂,并且替代是8(这太小了,会使结构几乎无用),或32(此时复制结构的成本已经成问题)如果你出于性能原因使用结构
但最终,这是性能建议.它回答了"哪个使用效率最高?结构或类?"的问题.但它没有回答"哪个最佳映射到我的问题域"的问题.
结构和类的行为不同.如果你需要一个struct的行为,那么我会说它是一个结构,无论大小.至少在遇到性能问题之前,请对代码进行概要分析,并发现结构存在问题.
您的链接甚至表示这仅仅是性能问题:
如果不满足这些条件中的一个或多个,请创建引用类型而不是结构.不遵守本指南可能会对性能产生负面影响.
Guf*_*ffa 26
如果结构不大于16个字节,则可以使用一些简单的处理器指令进行复制.如果它更大,则使用循环来复制结构.
只要结构不大于16个字节,处理器在复制结构时就像复制引用时一样需要做同样的工作.如果结构较大,则会失去具有s结构的性能优势,并且通常应该将其设为类.
Mar*_*ell 23
大小数字主要来自在堆栈上复制结构所花费的时间,例如传递给方法.任何比这更大的东西,你消耗大量的堆栈空间和CPU周期只是复制数据 - 当一个不可变类的引用(甚至使用解除引用)可以更高效.
正如其他答案所指出的那样,复制结构的每字节成本大于某个阈值(在早期版本的.NET中为16字节,但后来增长到20-24)远远大于较小结构的字节成本.然而,重要的是要注意,复制任何特定大小的结构一次将是创建相同大小的新类对象实例的成本的一小部分.如果在其生命周期中多次复制结构,并且不特别需要值类型语义,则类对象可能是优选的.但是,如果结构最终只被复制一次或两次,那么这种复制可能比创建新的类对象便宜.类对象变得更便宜的均衡数量的副本随着所讨论的结构/对象的大小而变化,但是对于低于"廉价复制"阈值的事物而言比上面的事物要高得多.
BTW,值得一提的另一点是,将结构作为ref
参数传递的成本与结构的大小无关.在许多情况下,可以通过使用值类型并将其传递来实现最佳性能ref
.readonly
但是,必须小心避免使用结构类型的属性或字段,因为访问其中任何一个都将创建有问题的结构的隐式临时副本.