IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 只要函数不发射异常,就添加noexcept声明(C++11/14)—————C++2.0第七讲 -> 正文阅读

[C++知识库]只要函数不发射异常,就添加noexcept声明(C++11/14)—————C++2.0第七讲

0 结论

  • 只要函数不会发射异常,就为其加上noexcept声明【接口中的组成部分】,调用方可能会对其产生依赖
  • noexcept性质对于移动凑走、swap、内存释放和析构函数最有价值

这样的影响:

  • 带有noexcept可以获得更多优化的机会,进而提高运行效率
  • 影响可以调用代码的异常安全性

2 提高运行效率

noexcept可以让编译器生成更好的目标代码。因为在带有noexcept声明的函数中,优化器不需要在异常传出函数的前提下,将执行期栈保持可开解状态(栈展开:在运行时期间从函数调用栈中删除函数实体。如果异常没有在抛出它的函数中被处理,则会激活栈展开。),也不需要异常逸出函数的前提下,保证其中的对象以其被构造顺序的逆序完成析构。

而以"throw()"异常规格声明的函数就享受不到noexcept带来的灵活优化。

3 异常安全保证

例如,移动操作,在C++98中,std::vector保持着强异常安全性,push_back操作是先将就内存复制到新内存,才将就内存中的对象析构。如果在复制元素过程中抛出异常,std::vector就会保持原样不变。

而在C++11中,对std::vector类型的对象元素复制操作部分换成了移动操作,这样的后果是不仅提升了效率,但是也面临着如果移动第n+1个元素抛出异常,则push_back操作就无法完成,也无法恢复到原始状态。C++11对于std::vector::push_back使用的就是“能移动则移动,必须复制时才复制”,类似的还有(std::vector::reserve,std::deque::insert等)。对于使用移动操作的都声明为noexcept,来说明该移动操作不会发射异常。

4 使用

  • 只有在保证函数实现长期具有noexcept性质的前提下,才给予其noexcept声明(不要故意扭曲函数实现,使之符合noexcept性质,造成主次不分);
  • 异常中立的函数永远不具备noexcept(异常中立函数:自身并不抛出异常,但是它们调用的函数可能会发射异常,当异常发生时,会把异常经由它们传至调用栈的更深一层);
  • 一般把noexcept保留给带有宽松契约的函数
    • 宽松契约:没有前置条件(函数中对形参数做出要求,当不满足时会抛出异常),无需关心函数状态
    • 狭隘契约:如果前置条件被违反,则结果成未定义的
  • 默认的,内存释放函数和所有析构函数(无论是否是用户定义,还是编译器生成)都隐式地具备noexcept性质。
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-07-24 11:15:53  更:2021-07-24 11:16:33 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/8 5:22:40-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码