已知移动构造函数的noexcept规范在C 0x中具有性能影响.例如,std :: vector T :: resize,std :: vector T :: reserve可以使用T的非投掷移动构造函数,如果它可以被证明不抛出. noexcept opeator是在编译时检
我的问题是关于用户定义的类T的成员交换或命名空间级交换.C 0x spec在导出std :: pair,std :: tuple,std :: array:swap的noexcept规范方面花费了一些精力,可能指示用户 – 定义的类应该尝试使用相同的原则.例如,std :: pair :: swap声明为等效于:
void std::pair::swap(pair& p) noexcept(noexcept(swap(first, p.first)) && noexcept(swap(second, p.second));
它基本上表示如果第一个或第二个成员的交换抛出,那么对的交换将抛出.第一,第二的交换可能在其成员方面具有他们自己的noexcept规范.
最后一个问题:是否有通用算法(在stl或其他方面),根据交换的noexcept规范做不同的事情?此外,是否存在性能影响?
除了在某些事物是noexcept(例如std :: vector)时具体表现不同的代码之外,声明函数noexcept可以允许编译器进行自己的优化.至少,编译器不必跟踪异常处理中涉及的某些事情,这可能会释放寄存器或执行较少的指令等.