考慮寫出乙個不丟擲異常的高效的swap函式
首先得說明為什麼我們要優化我們的swap函式,swap函式是異常安全性程式設計的脊柱,同時也是處理operator=自我賦值的重要手段。要編寫乙個優化版本的swap函式,我們首先需要了解標準庫是怎們定義的swap函式:
namespace std
}
這個函式很直觀,但是在某些情況寫是可以優化的,考慮一下這種pimpl手法(pointer to implementation) 該swap的效率顯然可以進一步提公升:
class widgetimpl
現在我們存在這麼兩個類,現在我們如果需要交換兩個物件,顯然我們呼叫std::swap()函式,但是很明顯std::swap函式的效率需要拷貝多次,效率極低。正確的做法是只交換兩個指標的指向。那麼正確的做法如下:
class widget
void swap(widget& rhs)
private:
widgetimpl *pimpl;
}
同時我們需要特化我們自己的swap函式:
namespace std
}
這種做法是合理的,但是如果我們的類是乙個模板類,但是c++並不允許對函式得偏特化,所以我們在類的命名空間中過載swap函式就行。
namespace widgetstuff
;templatevoid swap(widget&lhs,widget&rhs)
}
這樣我們在使用的時候,引入std::swap 自動根據型別進行了推斷
template void dosomthing(t& lhs,t&rhs)
Effective C 之二十五
要點 提供不會丟擲異常的swap函式。swap自stl引入後就成為異常安全 exception safe 程式設計的基石。在條款11避免自賦值時已談到過。stl中swap的預設實現是通過臨時變數實現交換。但是對某些型別這是很低效的,例如pimpl只需要交換指標即可。之後,meyers提出在std命名...
演算法(二十五)
1 給定兩個不字串,求出最長公共子串行的長度。int longestpublicsubsequence string x,string y else return math.max longestpublicsubsequence x.substring 1 y.substring 0 longes...
effective C 條款三十五解讀
考慮virtual函式以外的其他選擇 我們乙個遊戲軟體的血量計算方法為例來講解這個主題,我們在遊戲中有不同的遊戲人物,不同遊戲人物的血量計算方式不同,這驅使我們寫出這樣的物件導向 class gamecharacter 這裡我們的實現是public的virtual形式。這麼乙個簡單的實現可以延伸出很...