這在功能語言中很常見,特別是在使用TCO時。我只是想知道,除了易於編寫和跟蹤之外,它是否提供了任何性能優勢。訪問結構體中的變量是否與訪問它們一樣快?如果它們只是普通的參數?這種方法有什麼缺點嗎?如果遞歸函數需要多個參數,那麼將參數放入結構中會使性能受益
3
A
回答
3
沒有好處,因爲結構是按價值傳遞的。逐個傳遞多個參數將從正在運行的程序獲得與分配struct
相同數量的分配。此外,由於填充,struct
可能會給您帶來更壞的結果。
即使你通過struct
的指針,你仍然需要將它傳遞給調用的一個新的水平之前分配您struct
的新實例。理論上講,通過重複使用一次在多次調用中分配的結構,您可以獲得一些好處,但在大多數情況下,這是一種微型優化,不值得您麻煩(除非您的分析器另有說明)。
2
甚至遞歸涉及其萎縮的表現更在傳遞參數的遞歸函數使它進一步不規則,創建一個混淆開發人員,用自己的風險會
2
缺點很多堆棧操作:
如果您有__fastcall
可用,則遞歸函數可通過通過寄存器傳遞多個參數來提高性能。可用於此目的的通用寄存器數量可能因平臺而異。所有額外的參數都通過堆棧傳遞。
堆棧託管參數在計算函數的最開始被載入寄存器的機會很大。所以,每個通過參數的堆棧都需要至少一次內存訪問。如果你把所有的東西都打包到結構中並傳遞它的指針,那麼每個成員的訪問都會產生至少一次對內存的訪問。這裏沒有真正的好處
通過價值傳遞多個參數,你可以隨心所欲地改變它們。對於結構成員,您可以在計算中使用臨時副本(有效地重複傳遞多個參數),或者編譯器將修改後的值寫回結構實例所在的位置。這會產生不必要的開銷。
優點:
我將包輸出型參數到結構。這隻會減少參數的數量,並且可以設想功能原型,因爲它具有以人爲本質來操作具有功能的實體
相關問題
- 1. 需要參數的Javascript結構函數
- 2. 將參數傳遞到需要參數的函數中
- 3. 如果成員函數需要多個參數,則使用mem_fun_ref
- 4. 遞歸函數中的許多參數是否會導致性能問題?
- 5. 函數需要多少個參數?
- 6. 參數數據結構變化時的遞歸函數?
- 7. 將多個參數傳遞給函數
- 8. DdlGenerator構造函數不需要參數?
- 9. 依賴參數的結構遞歸
- 10. 遞歸函數得到一個參數
- 11. 如何使用DI的結構圖,如果一些構造函數參數需要手動傳遞
- 12. 遞歸函數記住最後結果作爲參數
- 13. 將函數結果作爲輸入參數傳遞給類中的函數
- 14. 在構造函數中使用許多參數的性能
- 15. 片段需要有一個無參數的構造函數 - 如果我的片段需要參數?
- 16. 如何將命名參數傳遞給另一個函數需要的函數?
- 17. Sum函數使用遞歸和多個參數
- 18. 遞歸SQL函數需要
- 19. 在遞歸函數中收集參數
- 20. SelendroidDriver構造函數是否需要傳遞兩個參數?網址和功能?
- 21. 使用Ninject注入類庫,其中構造函數接受多個參數
- 22. 如果我將一個結構傳遞給可變參數函數,會發生什麼?
- 23. 需要多個強參數
- 24. QFile需要多個參數?
- 25. 將參數傳遞給構造函數
- 26. 如果將事件也作爲參數需要,如何將參數傳遞給函數?
- 27. 如何將結構傳遞給回調函數作爲參數
- 28. 如何將結構類型作爲參數傳遞給函數?
- 29. 構造函數中的多個參數
- 30. 構造函數未能接受輸入參數