effective C 條款二十五解讀

2021-08-07 05:36:39 字數 927 閱讀 6343

考慮寫出乙個不丟擲異常的高效的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形式。這麼乙個簡單的實現可以延伸出很...