手机商城网站设计,建设银行 杭州招聘网站,典型的网络营销企业案例,网站主题定位转载;https://www.cnblogs.com/sword03/p/10020344.html
1 关键字noexcept
从C11开始#xff0c;我们能看到很多代码当中都有关键字noexcept。比如下面就是std::initializer_list的默认构造函数#xff0c;其中使用了noexcept。 constexpr initializer_list() noexcept: _M…转载;https://www.cnblogs.com/sword03/p/10020344.html
1 关键字noexcept
从C11开始我们能看到很多代码当中都有关键字noexcept。比如下面就是std::initializer_list的默认构造函数其中使用了noexcept。 constexpr initializer_list() noexcept: _M_array(0), _M_len(0) { }
该关键字告诉编译器函数中不会发生异常,这有利于编译器对程序做更多的优化。 如果在运行时noexecpt函数向外抛出了异常如果函数内部捕捉了异常并完成处理这种情况不算抛出异常程序会直接终止调用std::terminate()函数该函数内部会调用std::abort()终止程序。
2 C的异常处理
C中的异常处理是在运行时而不是编译时检测的。为了实现运行时检测编译器创建额外的代码然而这会妨碍程序优化。 在实践中一般两种异常抛出方式是常用的
一个操作或者函数可能会抛出一个异常;一个操作或者函数不可能抛出任何异常。
后面这一种方式中在以往的C版本中常用throw()表示在C 11中已经被noexcept代替。 void swap(Type x, Type y) throw() //C11之前{x.swap(y);}void swap(Type x, Type y) noexcept //C11{x.swap(y);}
3 有条件的noexcecpt
在第2节中单独使用noexcept表示其所限定的swap函数绝对不发生异常。然而使用方式可以更加灵活表明在一定条件下不发生异常。 void swap(Type x, Type y) noexcept(noexcept(x.swap(y))) //C11{x.swap(y);}
它表示如果操作x.swap(y)不发生异常那么函数swap(Type x, Type y)一定不发生异常。
一个更好的示例是std::pair中的移动分配函数move assignment它表明如果类型T1和T2的移动分配move assign过程中不发生异常那么该移动构造函数就不会发生异常。 pair operator(pair __p)noexcept(__and_is_nothrow_move_assignable_T1,is_nothrow_move_assignable_T2::value){first std::forwardfirst_type(__p.first);second std::forwardsecond_type(__p.second);return *this;}
4 什么时候该使用noexcept
使用noexcept表明函数或操作不会发生异常会给编译器更大的优化空间。然而并不是加上noexcept就能提高效率步子迈大了也容易扯着蛋。 以下情形鼓励使用noexcept
移动构造函数move constructor移动分配函数move assignment析构函数destructor。这里提一句在新版本的编译器中析构函数是默认加上关键字noexcept的。下面代码可以检测编译器是否给析构函数加上关键字noexcept。struct X{~X() { };};int main(){X x;// This will not fire even in GCC 4.7.2 if the destructor is// explicitly marked as noexcept(true)static_assert(noexcept(x.~X()), Ouch!);}
叶子函数Leaf Function。叶子函数是指在函数内部不分配栈空间也不调用其它函数也不存储非易失性寄存器也不处理异常。
最后强调一句在不是以上情况或者没把握的情况下不要轻易使用noexception。