[英]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.