【问题标题】:Does noexcept specification of swap has performance impact?交换的 noexcept 规范对性能有影响吗?
【发布时间】:2011-08-31 00:54:35
【问题描述】:

已知关于移动构造函数的noexcept 规范在 C++0x 中具有性能影响。例如,std::vector<T>::resizestd::vector<T>::reserve 可以使用 T 的非投掷移动构造函数,如果可以证明它不会投掷的话。 noexcept 操作符是在编译时检查该属性的方法。如果 noexcept 说 T 的 move-ctor 不抛出,则 T 对象将被移动而不是复制,最有可能实现更高的性能。

我的问题是关于用户定义类 T 的成员交换或命名空间级交换。C++0x 规范花费了一些精力来导出 std::pairstd::tuplestd::array:swap 的 noexcept 规范,这可能表明该用户- 定义的类应该尝试使用相同的原则。例如,std::pair::swap 被声明为等价于:

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

它基本上说如果firstsecond 成员的交换抛出,则该对的交换将抛出。 firstsecond 的交换在其成员方面可能有自己的 noexcept 规范。

最后的问题是:是否有通用算法(在 stl 或其他格式中)取决于 swap 的 noexcept 规范做不同的事情?此外,这对性能有影响吗?

【问题讨论】:

    标签: stl swap c++11


    【解决方案1】:

    除了当某些东西是 noexcept 时特别表现不同的代码(例如std::vector),声明一个函数 noexcept 可以允许编译器进行自己的优化。至少编译器不必跟踪异常处理中涉及的某些内容,这可能会释放寄存器或执行更少的指令。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-12
      • 2014-01-05
      • 2019-11-04
      • 1970-01-01
      • 1970-01-01
      • 2012-11-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多