【发布时间】:2011-08-31 00:54:35
【问题描述】:
已知关于移动构造函数的noexcept 规范在 C++0x 中具有性能影响。例如,std::vector<T>::resize、std::vector<T>::reserve 可以使用 T 的非投掷移动构造函数,如果可以证明它不会投掷的话。 noexcept 操作符是在编译时检查该属性的方法。如果 noexcept 说 T 的 move-ctor 不抛出,则 T 对象将被移动而不是复制,最有可能实现更高的性能。
我的问题是关于用户定义类 T 的成员交换或命名空间级交换。C++0x 规范花费了一些精力来导出 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));
它基本上说如果first 或second 成员的交换抛出,则该对的交换将抛出。 first、second 的交换在其成员方面可能有自己的 noexcept 规范。
最后的问题是:是否有通用算法(在 stl 或其他格式中)取决于 swap 的 noexcept 规范做不同的事情?此外,这对性能有影响吗?
【问题讨论】: