簡體   English   中英

c ++變量聲明

[英]c++ variable declaration

我想知道這段代碼:

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次?

  • 在效率方面也是如此。
  • 在可讀性方面不一樣。 第二個在這方面更好,不是嗎?

這是代碼保持隱藏的語義差異,因為它沒有對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();
  /* ... */
}

在這種情況下,它是相同的。 盡可能使用最小的范圍以獲得最易讀的代碼。

如果int是一個具有重要構造函數和析構函數的類,那么第一個(在循環之外聲明它)可以節省很多 - 但是在內部你通常需要重新創建狀態...所以它經常最終沒有節省所有。

容器可能會產生影響的一個例子。 字符串或向量使用內部存儲,該存儲會增長以適合其存儲的數據大小。 您可能不希望每次通過循環重建此容器,而只是清除其內容,並且可能不需要在循環內重新分配那么多。 這可以(在某些情況下)導致顯着的性能改進。

底線是寫清楚,如果分析顯示它很重要,移出它:)

它們在效率方面是相同的 - 你應該相信你的編譯器擺脫了無法估量的微小差異。 第二是更好的設計。

編輯:對於自定義類型,尤其是那些處理內存的類型,不一定如此。 如果您正在為任何T編寫循環,我肯定會使用第一個表單以防萬一。 但是如果你知道它是一個內置類型,比如int,pointer,char,float,bool等我會去第二個。

在第二個例子中,p僅在for循環內部可見。 你不能在你的代碼中進一步使用它。 在效率方面,他們是平等的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM