2010-05-08 124 views
5

我想知道是否此代碼:C++變量聲明

int main(){ 
    int p; 
    for(int i = 0; i < 10; i++){ 
     p = ...; 
    } 
    return 0 
} 

是完全一樣的一個

int main(){ 
    for(int i = 0; i < 10; i++){ 
     int p = ...; 
    } 
    return 0 
} 

在效率的術語? 我的意思是,p變量將在第二個例子中重新創建10次?

回答

9
  • 它在效率方面是一樣的。
  • 在可讀性方面不盡相同。第二個在這方面比較好,不是嗎?

這是一個語義差異,其代碼隱藏不斷,因爲它沒有發揮作用的INT,但它使人類讀者的差異。你想在循環之外攜帶...的任何計算值嗎?你不這樣做,所以你應該寫出反映你意圖的代碼。

人類讀者將需要尋求功能,並尋找p的其他用途,以確認自己所做的只是過早的「優化」,並沒有更深的目的。

假設它讓你使用的類型的不同,你可以通過評論你的代碼

/* p is only used inside the for-loop, to keep it from reallocating */ 
std::vector<int> p; 
p.reserve(10); 

for(int i = 0; i < 10; i++){ 
    p.clear(); 
    /* ... */ 
} 
+0

那麼,只有您的編譯器不會將堆棧變量置零,它的效率纔是相等的。 – 2010-05-08 12:37:50

+1

我一開始並不擔心自己的效率,但可讀性很高。一旦工作,如果速度太慢,那麼現在是時候對其進行分析並優化可能的內容。 – 2010-05-08 13:29:49

0

在第二個例子中幫助人類讀者p是隻有內部的for循環可見。你不能在你的代碼中進一步使用它。 就效率而言,它們是相等的。

4

在這種情況下,它是一樣的。使用可讀性最高的代碼的最小範圍。

如果int是一個具有重要構造函數和析構函數的類,那麼第一個函數(在循環外部聲明)可以節省大量資金 - 但是在通常情況下,您通常需要重新創建狀態......所以通常最終會根本沒有儲蓄。

容器可能會有所不同的一個實例。一個字符串或向量使用內部存儲器,該存儲器的大小將隨着它所存儲的數據大小而增長。您可能不希望每次都通過循環重構此容器,而只需清除其內容,並且可能不需要在循環內重新分配多少個容器。這可以(在某些情況下)導致顯着的性能改進。

的底線是它寫清楚,如果分析表明它很重要,移動它了:)

1

他們是在效率方面平等的 - 你應該相信你的編譯器擺脫沒法比差小。第二個是更好的設計。

編輯:這不一定適用於自定義類型,尤其是那些處理內存的類型。如果你正在爲任何T寫一個循環,我肯定會使用第一種形式以防萬一。但是如果你知道它是一個內置類型,比如int,pointer,char,float,bool等,我會選擇第二種。