簡體   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