我從C++ faq讀取了「本地應該在其首次使用附近聲明」。另外Scott Meyer的Effective C++第26項也出於性能方面的原因。但是我最近碰巧聽到有人說,編譯器足夠聰明,可以優化變量,而不管它們在函數中實際使用的範圍。他建議在函數的頂部聲明變量以便於理解(我不會購買這個理由)。他對編譯器優化是否正確? (問題是關於性能和編譯器優化,而不是代碼可讀性)。變量聲明位置的編譯器優化
回答
是的,它們足夠聰明。
但也有一個軟件技術答案:你應該這樣做,因爲它是一種更好的編程風格。
將變量聲明放在變量的使用位置附近會增加局部性,並且可以使代碼和程序流程更易於理解。另外,如果一個變量被放置在一個嵌套的範圍內,那麼當它離開它所在的範圍時它將被「破壞」,幫助像RAII這樣的東西。
編譯器與它無關。關於定義變量(本地或其他)有兩個通用規則 :將範圍和 可見性儘可能小,並且如果可能,請在 中初始化該定義。這些規則適用於人類讀者,而不是編譯器。 這兩個確實導致「宣佈當地人接近他們的第一次使用」,作爲一個推論 。
你的意思是說在局部範圍內(即在一個函數內部的代碼塊中)聲明的變量(帶有構造符/析構函數)沒有性能優勢?即使在功能塊的頂部聲明,編譯器是否會在內部代碼塊中智能地調用構造函數? –
@nariknahom編譯器不能改變調用構造函數或析構函數的地方;這是由語言定義的。通常情況下(但有重大的例外情況,特別是涉及RAII的情況),這不會產生真正的差異。 (像'scoped_lock'這樣的東西,你真的不想讓編譯器改變析構函數的調用方式,是嗎?) –
你應該總是努力寫一個容易理解和理解的源代碼。
即使編譯器能夠優化它,仍然是一個很好的做法。它爲您提供了改進的可讀性,您不需要緩存並記住變量在塊開始時初始化的值。
- 1. 由編譯器優化的變量
- 2. 編譯器錯誤變量聲明
- 3. JIT編譯器是否優化(內聯)不必要的變量聲明?
- 4. 優化函數聲明位置
- 5. noexcept說明符和編譯器優化
- 6. java中的類變量聲明位置
- 7. 編譯器優化
- 8. 編譯器優化
- 9. 編譯器是否優化對常量變量的引用?
- 10. 奇怪的未聲明的變量編譯器錯誤
- 11. TypeScript編譯器找不到我先前聲明的變量
- 12. 爲什麼編譯器說我沒有聲明我的變量?
- 13. C++ 0x優化編譯器質量
- 14. 編譯器優化與增量
- 15. Java編譯器拒絕具有參數化內部類的變量聲明
- 16. 克++編譯器的優化
- 17. 谷歌封閉編譯器的高級優化不優化一些變量
- 18. MS編譯器優化,替代函數中的變量?
- 19. 編譯器優化掉的變量,我需要
- 20. 關於變量範圍的C/C++編譯器優化
- 21. 循環自變量的編譯器優化
- 22. VS2010 C++/C#編譯器可以優化掉在循環內聲明的變量嗎?
- 23. 本地變量聲明放置所需的Microsoft C/C++編譯器開關
- 24. 如何爲google閉包編譯器聲明全局變量?
- 25. 編譯器聲稱變量不明確,不會運行
- 26. 編譯器扔誤差變量未聲明X ++
- 27. 變量聲明,編譯器找不到符號
- 28. GNU編譯器優化
- 29. C++編譯器優化
- 30. 編譯器優化實現
常見問題的建議是提高可讀性。這是爲了人類的優勢,而不是編譯器 – sashang
等待 - 需要什麼地方? – Puppy
@DeadMG編輯了這個問題。現在希望它清楚。 –