C#,儘管尾部呼叫最佳化對於高效遞歸函數有好處,但目前不支援它。
挑戰在於執行速度和程式碼最佳化複雜性之間的權衡。 即時 (JIT) 編譯優先考慮快速編譯而不是大量程式碼分析。儘管公共語言運行時 (CLR) 可以 支援尾部呼叫最佳化,但 C# 編譯器不會產生必要的操作碼。
考慮這個例子:
<code class="language-csharp">private static void Foo(int i) { if (i == 1000000) return; if (i % 100 == 0) Console.WriteLine(i); Foo(i+1); }</code>
即使 Visual Studio 2008 也未能將這個遞歸函數最佳化為循環,這說明了編譯器分析的限制。
像 F# 這樣的語言已經實作了必要的編譯器擴充來產生適當的操作碼以進行尾部呼叫最佳化。 這表明 C# 的未來版本可能會包含此功能。然而,原生圖像生成器 (NGen) 編譯的保守性仍然是一個潛在的障礙,因為它優先考慮避免效能回歸。
要更深入地了解此主題,請參閱參考的部落格文章。 它提供了 4.0 版本中與尾部呼叫最佳化及其架構依賴項相關的 CLR 變更的詳細資訊。
以上是為什麼 C# 不優化尾呼叫遞歸?的詳細內容。更多資訊請關注PHP中文網其他相關文章!