gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 22:56:54 26 4
gpt4 key购买 nike

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

为什么 C# 编译器不自动生成 所有 不可变结构 readonly,然后不询问就使用那些 ref 语言特性?我的意思是它们无论如何都是不可变的,如果你在任何地方都通过引用传递它们会出什么问题?

最佳答案

它只是作为对大型 结构的可能性能优化。用结构替换类时可能会得到的那种。小型结构在按值传递时性能最佳,然后可以通过 CPU 寄存器传递结构成员,而不必担心必须将更改传播回调用者。通过引用传递需要对每个成员访问进行额外的间接访问,这会抵消结构的一个优势。

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

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

关于c# - 为什么编译器不自动检测只读结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47786166/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com