【c++】noexcept关键字

2023/6/5 20:54:37

该关键字告诉编译器,函数中不会发生异常,这有利于编译器对程序做更多的优化

如果在运行时,noexecpt函数向外抛出了异常(如果函数内部捕捉了异常并完成处理,这种情况不算抛出异常),程序会直接终止,调用std::terminate()函数,该函数内部会调用**std::abort()**终止程序。

noexcept的用法

void func_not_throw() noexcept;  保证不抛出异常
void func_not_throw() noexcept(true);  和上式一个意思

void func_throw() noexcept(false);  可能会抛出异常
void func_throw();  和上式一个意思,若不显示说明,默认是会抛出异常(除了析构函数,析构函数默认为抛出异常

使用noexcept的注意点

1.对于一个函数而言noexcept 说明符要么出现在该函数的所有声明语句和定义语句,要么一次也不出现。
2.函数指针及该指针所指的函数必须具有一致的异常说明。
3.在 typedef 或类型别名中则不能出现 noexcept。
4.在成员函数中,noexcept 说明符需要跟在 const 及引用限定符之后,而在 final、override 或虚函数的 =0 之前。
5.如果一个虚函数承诺了它不会抛出异常,则后续派生的虚函数也必须做出同样的承诺;与之相反,如果基类的虚函数允许抛出异常,则派生类的虚函数既可以抛出异常,也可以不允许抛出异常。
6.需要注意的是,编译器不会检查带有 noexcept 说明符的函数是否有 throw。

void func_not_throw() noexcept {
    throw 1; // 编译通过,不会报错(可能会有警告)
}

这会发生什么呢?程序会直接调用 std::terminate,并且不会栈展开(也可能会调用或部分调用,取决于编译器的实现)。另外,即使你有使用 try-catch,也无法捕获这个异常。

什么时候该使用noexcept?

使用noexcept表明函数或操作不会发生异常,会给编译器更大的优化空间。然而,并不是加上noexcept就能提高效率。
以下情形鼓励使用noexcept:

  1. 移动构造函数 移动赋值函数
  2. 析构函数(析构函数默认是noexcept)
  3. 还有那些你可以 100% 保证不会 throw 的函数

指定异常说明符的益处

1.语义

从语义上,noexcept 对于代码规范是有益的,就像const一样(别人一看见就知道这个变量是不能被修改的,增加了代码的可读性。

2.显示指定 noexcept 的函数,编译器会进行优化

因为在调用 noexcept 函数时不需要处理异常,所以编译器可以生成更高效的二进制码(编译器是否优化不一定,但理论上 noexcept 给了编译器更多优化的机会)。
另外编译器在编译一个 noexcept(false) 的函数时可能会生成很多冗余的代码,虽然只在出错的时候执行,但还是会对指令缓存造成影响,进而影响程序整体的性能。


http://www.jnnr.cn/a/154049.html

相关文章

ubuntu22.04安装教程

1、选择语言 (默认) 2、取消安装更新 (默认) 3、选择键盘语言 (默认) 4、配置ip,可以直接选择dhcp,也可选择配置静态ip (默认) 5、配置代理 跳过不填写 6、设置镜像源 (默认) https://mirrors.aliyun.com/ubuntu/ 7、磁盘配置,默认即可 (默…

非凡社群管理之如何高效的进行社群管理

一、初始成员的严格筛选 我们建立社群初期,就要严格筛选初始会员,争取让我们找到的第一批种子用户,就是有着共同的连接点。而不是找到一群人之后,再去培养大家的同好。这样不仅吃力不讨好,往往效果也不太高&#xf…

机械硬盘,Win10系统,磁盘100%

问题描述 使用机械硬盘,装了Win10系统,打开文件夹或程序,非常的慢,通过任务管理器查看性能,显示磁盘一直处于100%的状态。电脑概览如下: 电脑型号 技嘉 B460MAORUSPRO 操作系统 Microsoft Windows 10 专业…

中国传统节日春节网页HTML代码 春节大学生网页设计制作成品下载 学生网页课程设计期末作业下载 DW春节节日网页作业代码下载

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

六、nacos环境隔离、服务配置拉取和多环境配置共享

文章目录一、环境隔离-namespace1.namespace理解2.创建命名空间二、Nacos-实现配置管理三、nacos-实现服务配置拉取1.非热更新2.热更新:四、实现多环境配置共享1.开发环境:2.测试环境3.结论一、环境隔离-namespace 1.namespace理解 Nacos中服务存储和数…

关于环境保护html网页设计完整版,5个以环境为主题的网页设计与实现

🎀 精彩专栏推荐👇🏻👇🏻👇🏻 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业…

学生个人网页设计作品 HTML+CSS+JavaScript仿小米商城(8页) 学生个人网页模板 简单个人主页成品 个人网页制作 HTML学生个人网站作业设计

临近期末,大一新生的各种考试和专业结课作业纷至沓来。什么高数啊、线代啊、C语言、网页设计等,简直让人头大。你还在为网页设计老师的作业要求感到头大?网页作业无从下手?网页要求的总数量太多?没有合适的模板&#x…

李沐论文精度系列之七:Two-Stream双流网络、I3D

文章目录一、双流网络1.1 前言1.2 网络结构1.3 光流(Optical flow)1.3.1 什么是光流1.3.2 如何利用光流1.3.3 双向光流(Bi-directional optical flow)1.3.4 光流的局限性及和对应的预处理(抽取)方式1.3.5 视频模型测试1.4 实验1.4…

通用后台管理系统前端界面Ⅺ——信息列表页(弹窗复用增改、CRUD前端基础实现)

因为需求发生了点变化&#xff0c;所以把之前的代码稍改一下&#xff0c;把之前的信息列表全复制到用户列表中&#xff0c;最后效果一样。UserList.vue <template><div class"UserList"><!-- 查询、重置 --><el-form :inline"true" :…

cocos2dx创建工程并在androidstudio平台编译

本文主要是通过androidstudio进行编译运行cocos2dx工程。 前置条件&#xff1a; 1&#xff1a;androidstudio已经下载并安装。 2&#xff1a;cocos2dx已经下载并打开。 这里androidstudio使用2021.3.1版本&#xff0c;cocos2dx使用4.0版本。 第一步&#xff0c;首先安装py…

微服务介绍微服务环境搭建

一、微服务介绍 从互联网早起到现在&#xff0c;系统架构大体经历了下面几个过程: 单体应用架构--->垂直应用架构--->分布 式架构--->SOA架构--->微服务架构&#xff0c;当然还有悄然兴起的Service Mesh(服务网格化)。 微服务架构 微服务架构在某种程度上是面向…

云原生k8s的前世今生--Docker

不可修改(immutability)和幂等性(idempotent)是一致依赖困扰软件发布与运维的两个难题。以nodejs等解析执行的应用而言&#xff0c;如何控制发布后的软件不被修改运行&#xff0c;发布后&#xff0c;经常发现因为运行环境差异导致各种水土不服&#xff1a;比如应用程序对底层操…

基于JSP的网上书城平台【数据库设计、源码、开题报告】

数据库脚本下载地址&#xff1a; https://download.csdn.net/download/itrjxxs_com/86469277 主要使用技术 ServletJDBCJSPC3P0JqueryMysql 功能介绍 1). 用户模块功能有&#xff1a; 用户注册: 表单页面是jQuery做校验(包含了ajax异步请求) 表单页面使用一次性图形验证码…

基于双目相机拍摄图像的深度信息提取和目标测距matlab仿真

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB程序 1.算法描述 双目相机一般由左眼和右眼两个水平放置的相机组成。当然也可以做成上下两个目&#xff0c;但我们见到的主流双目都是做成左右的。在左右双目的相机中&#xff0c;我们可以把两个相机都看作针…

Pytorch中CrossEntropyLoss()详解

一、损失函数 nn.CrossEntropyLoss() 交叉熵损失函数 nn.CrossEntropyLoss() &#xff0c;结合了 nn.LogSoftmax() 和 nn.NLLLoss() 两个函数。 它在做分类&#xff08;具体几类&#xff09;训练的时候是非常有用的。 二. 什么是交叉熵 交叉熵主要是用来判定实际的输出与期望…

ASEMI肖特基二极管MBR40200PT参数,MBR40200PT规格

编辑-Z ASEMI肖特基二极管MBR40200PT参数&#xff1a; 型号&#xff1a;MBR40200PT 最大重复峰值反向电压&#xff08;VRRM&#xff09;&#xff1a;200V 最大平均正向整流输出电流&#xff08;IF&#xff09;&#xff1a;40A 峰值正向浪涌电流&#xff08;IFSM&#xff0…

基于ASP学生资助管理系统的设计与实现

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做ASP程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下&#xff0c;你想解决的问题…

软件测试 -- 进阶 4 软件测试策略

巧而好度&#xff0c;必攻&#xff1b;勇而好问&#xff0c;必胜&#xff1b;智而好谋&#xff0c;必成。-- 《孔子家语》 翻译&#xff1a;灵巧而有擅长揣摩的人&#xff0c;必定坚定&#xff1b;勇敢而有擅长请教的人&#xff0c;必定取胜&#xff1b;富有智慧而有擅长谋…

视频怎么消除人声?一款视频去人声软件,轻松去除视频人声

视频消除人声是一个优质的视频文件必须经历的步骤。当前&#xff0c;分享视频的用户越来越多&#xff0c;只有原创且有亮点的视频才能更吸引人。但是很多时候自己录制的原创视频总是有各种声音&#xff0c;所以很难制作出一个好的视频&#xff0c;获得更多的关注。 那视频怎么消…

基于ssm+mysql+jsp学生成绩管理系统(含实训报告)

基于ssmmysqljsp学生成绩管理系统(实训报告&#xff09;一、系统介绍二、功能展示1.学生信息查询2.学生信息添加3.学生信息修改4.学生信息删除四、获取源码一、系统介绍 系统主要功能&#xff1a;系统实现了学生信息查询、添加、修改、删除。 环境配置&#xff1a; Jdk1.8 M…