2011-08-31 45 views
4

移動構造函數的noexcept規範已知在C++ 0x中具有性能影響。例如,std::vector<T>::resize,std::vector<T>::reserve可以使用T的非投擲移動構造函數,如果它可以被證明不拋出。 noexcept操作符是在編譯時檢查該屬性的方法。如果noexcept表示T的move-ctor沒有拋出,T對象將被移動而不是被複制,最有可能實現更高的性能。交換noexcept規範是否會影響性能?

我的問題是有關成員交換或命名空間級別的交換爲用戶定義的類T.的C++ 0x規範花費一些精力在出口no​​except的std::pairstd::tuplestd::array:swap可能表明用戶定義的類應儘量規範使用相同的原則。例如,std::pair::swap聲明等同於:

void std::pair::swap(pair& p) noexcept(noexcept(swap(first, p.first)) && noexcept(swap(second, p.second)); 

它基本上是說,如果firstsecond成員的任何交換拋出對的交換將拋出。交換first,second可能有他們自己的noexcept規範的成員。

最後的問題:有沒有在那裏(在STL或其他)的泛型算法,取決於交換noexcept規範做不同的事情?而且,這有什麼表現含義?

回答

3

除了某些代碼在noexcept(如std::vector)之外具有明顯不同行爲的代碼之外,聲明函數noexcept可以允許編譯器執行自己的優化。至少編譯器不必跟蹤涉及異常處理的某些事情,這可能會釋放寄存器或執行更少的指令等等。