2011-08-31 72 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可以允许编译器执行自己的优化。至少编译器不必跟踪涉及异常处理的某些事情,这可能会释放寄存器或执行更少的指令等等。

相关问题