c# - 为什么 .NET 结构应该小于 16 个字节?

标签 c# .net

现在我在一些地方读到结构的最大实例大小应该是 16 个字节。

但我看不到数字 (16) 从何而来。

在网上浏览时,我发现有些人认为这是获得良好性能的近似数字,但 Microsoft 说这是一个硬性上限。 (例如 MSDN)

对于为什么是 16 个字节,有没有人给出明确的答案?

最佳答案

这只是一个性能经验法则。

要点在于,因为值类型是按值传递的,所以如果将结构传递给函数,则必须复制整个结构的大小,而对于引用类型,只需复制引用(4 个字节) .一个结构可能会节省一些时间,因为你删除了一个间接层,所以即使它大于这 4 个字节,它仍然可能比传递引用更有效。但在某些时候,它变得如此之大,以至于复制的成本变得显而易见。一个常见的经验法则是,这通常发生在 16 个字节左右。选择 16 是因为它是一个很好的整数,是 2 的幂,并且备选方案是 8(太小,并且会使结构几乎无用)或 32(此时复制结构的成本已经成为问题如果您出于性能原因使用结构)

但归根结底,这是性能建议。它回答了“使用哪个最有效?结构还是类?”的问题。但它没有回答“哪个最能映射到我的问题域”的问题。

结构和类的行为不同。如果您需要一个结构的行为,那么我会说无论大小如何,都让它成为一个结构。至少在您遇到性能问题、分析您的代码并发现您的结构有问题之前。

您的链接甚至说这只是性能问题:

If one or more of these conditions are not met, create a reference type instead of a structure. Failure to adhere to this guideline can negatively impact performance.

关于c# - 为什么 .NET 结构应该小于 16 个字节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1082311/

相关文章:

c# - wsdl.exe 结果为 "SOAP 1.1 binding was not found"

c# - 如何从无效的html中获取有效的html?

.net - 获取 ADO.NET 中的参数前缀

.net - 检查 session 项是否存在,自身失败,对象引用未设置错误

c# - C#编译器会优化这段代码吗?

c# - 在 C# winform 中,我得到了 : "only truetype fonts are supported. This is not a TrueType Font"

c# - 如何递归地找到对象及其成员使用的所有类型?

c# - 在排队的后台工作项目中保留主体

c# - 创建一个完成的 Task<T>

c# - 维护多个实例的处理顺序