为什么编译器不自动检测只读结构?

bas*_*his 5 .net c# struct

C#7.2引入了只读结构的概念.所以基本上我们现在可以readonly struct在任何不可变的结构上使用关键字.这样可以降低性能开销,因为这些结构现在可以通过引用传递new in关键字和ref return.

为什么C#编译器不会自动生成所有不可变的结构readonly,然后在ref不询问的情况下使用这些语言功能?我的意思是他们无论如何都是一成不变的,如果你通过引用到处传递它们会出现什么问题呢?

Han*_*ant 7

它仅仅意味着对大型结构可能的性能优化.用结构替换类时最终可能会遇到的那种.小结构在按值传递时表现最佳,然后结构成员可以通过CPU寄存器,而不必担心必须将更改传播回调用方.通过引用传递需要在每个成员访问上额外间接,这使结构的一个优点无效.

按值传递大型结构会导致在方法入口和出口处复制struct值的成本.抖动始终假定成员访问需要快速,即使不频繁的成员访问会使参考传递更加优化.从技术上讲,优化器可以找出最佳选择,但是这种流分析很难正确完成,优化器总是能够避开停机问题.必须在不需要改变CLR和抖动的情况下进行这些语言更改.

所以盲目地应用in(或ref)不是一个好主意,你必须交换额外间接的成本与复制.实际上,当探查器向您显示特定方法调用是瓶颈时,您会考虑这一点.正如C#团队所做的那样,我认为这些变化的灵感来自于让Roslyn更快.