08-noexcept关键字

c++2.0中,一条经典的规范是:尽可能地为一个函数加上noexcept声明,意味着程序员向编译器保证该函数不会发射异常。

1. c++11 noexcept关键字作用

  • 在c++11中,noexcept用法如下:
    void func()noexcept{} 
    
    void func()noexceptexpress{} 
    //此种写法会根据表达式(express)的结果决定是否发射异常
    
  • 需要注意的是,如果我们承诺了func函数是不会抛出异常的,那么就必须同时保证func函数调用的其他函数也是不会抛出异常,否则无法保证func的noexcept性质
  • c++11为所有类的析构函数都加上了“隐式”noexcept声明。

2. 为函数加上noexcept声明的最佳时机

直接给出建议:当你为一个类设计移动系列函数时,如果可以,最应该为其加上noexcept,以便此类在使用标准库容器时可以用移动操作来代替拷贝。

以vector为例,很多标准库容器需要特定时机的扩容操作:把元素从旧内存拷贝到新开辟的内存,再析构旧内存中的元素。

针对这种情况明显可以用移动操作来优化之。(通常移动操作比拷贝操作速度更快)

但标准库的做法是:如果容器中类的移动操作函数带有noexcept声明,则使用移动操作来代替拷贝;如果没有noexcept声明,则用拷贝来完成扩容。

因此你会发现,将各种移动系列的函数设计为noexcept,会对标准库性能提升有巨大的帮助!


comments powered by Disqus