2012-09-27 37 views
-2

我從C++ faq讀取了「本地應該在其首次使用附近聲明」。另外Scott Meyer的Effective C++第26項也出於性能方面的原因。但是我最近碰巧聽到有人說,編譯器足夠聰明,可以優化變量,而不管它們在函數中實際使用的範圍。他建議在函數的頂部聲明變量以便於理解(我不會購買這個理由)。他對編譯器優化是否正確? (問題是關於性能和編譯器優化,而不是代碼可讀性)。變量聲明位置的編譯器優化

+2

常見問題的建議是提高可讀性。這是爲了人類的優勢,而不是編譯器 – sashang

+0

等待 - 需要什麼地方? – Puppy

+0

@DeadMG編輯了這個問題。現在希望它清楚。 –

回答

2

是的,它們足夠聰明。

但也有一個軟件技術答案:你應該這樣做,因爲它是一種更好的編程風格。

0

將變量聲明放在變量的使用位置附近會增加局部性,並且可以使代碼和程序流程更易於理解。另外,如果一個變量被放置在一個嵌套的範圍內,那麼當它離開它所在的範圍時它將被「破壞」,幫助像RAII這樣的東西。

4

編譯器與它無關。關於定義變量(本地或其他)有兩個通用規則 :將範圍和 可見性儘可能小,並且如果可能,請在 中初始化該定義。這些規則適用於人類讀者,而不是編譯器。 這兩個確實導致「宣佈當地人接近他們的第一次使用」,作爲一個推論 。

+0

你的意思是說在局部範圍內(即在一個函數內部的代碼塊中)聲明的變量(帶有構造符/析構函數)沒有性能優勢?即使在功能塊的頂部聲明,編譯器是否會在內部代碼塊中智能地調用構造函數? –

+0

@nariknahom編譯器不能改變調用構造函數或析構函數的地方;這是由語言定義的。通常情況下(但有重大的例外情況,特別是涉及RAII的情況),這不會產生真正的差異。 (像'scoped_lock'這樣的東西,你真的不想讓編譯器改變析構函數的調用方式,是嗎?) –

0

你應該總是努力寫一個容易理解和理解的源代碼。

即使編譯器能夠優化它,仍然是一個很好的做法。它爲您提供了改進的可讀性,您不需要緩存並記住變量在塊開始時初始化的值。