繁体   English   中英

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

[英]Why does not compiler auto detect readonly structs?

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM