当前位置: 首页 > news >正文

C++中noexcept的具体特性及其代码示例

文章目录

        • 1. **作为异常说明符**
        • 2. **作为运算符**
        • 3. **性能优化**
        • 4. **异常安全性**
      • 总结

1. 作为异常说明符

noexcept可以放在函数声明或定义的后面,表示该函数不会抛出任何异常。如果函数在运行时抛出异常,程序会立即终止,并调用std::terminate()函数。

特性:

  • 编译时检查:编译器会检查函数是否可能抛出异常。如果函数内部调用了可能抛出异常的代码,编译器会报错。
  • 运行时终止:如果标记为noexcept的函数在运行时抛出异常,程序会立即终止。

代码示例:

#include <iostream>
#include <stdexcept>void safeFunction() noexcept {// 这个函数不会抛出异常std::cout << "safeFunction called" << std::endl;
}void unsafeFunction() {// 这个函数可能会抛出异常throw std::runtime_error("An error occurred");
}int main() {try {safeFunction();unsafeFunction(); // 这里会抛出异常} catch (const std::exception& e) {std::cerr << "Exception caught: " << e.what() << std::endl;}return 0;
}

输出:

safeFunction called
Exception caught: An error occurred

如果将unsafeFunction标记为noexcept

void unsafeFunction() noexcept {// 这个函数可能会抛出异常throw std::runtime_error("An error occurred");
}

输出:

safeFunction called
terminate called after throwing an instance of 'std::runtime_error'what():  An error occurred

程序会立即终止,并调用std::terminate()

2. 作为运算符

noexcept(expression)用于检查表达式是否可能抛出异常。如果表达式不会抛出异常,则返回true;否则返回false

特性:

  • 编译时检查:编译器会检查表达式是否可能抛出异常。
  • 返回值:返回一个布尔值,表示表达式是否安全。

代码示例:

#include <iostream>
#include <stdexcept>void safeFunction() noexcept {std::cout << "safeFunction called" << std::endl;
}void unsafeFunction() {throw std::runtime_error("An error occurred");
}int main() {std::cout << "safeFunction noexcept: " << noexcept(safeFunction()) << std::endl;std::cout << "unsafeFunction noexcept: " << noexcept(unsafeFunction()) << std::endl;return 0;
}

输出:

safeFunction noexcept: 1
unsafeFunction noexcept: 0
3. 性能优化

标记为noexcept的函数,编译器可以进行一些优化,例如删除异常处理代码、进行函数内联等,从而提高程序的性能。

代码示例:

#include <iostream>
#include <chrono>void safeFunction() noexcept {// 这个函数不会抛出异常std::this_thread::sleep_for(std::chrono::milliseconds(100));
}void unsafeFunction() {// 这个函数可能会抛出异常std::this_thread::sleep_for(std::chrono::milliseconds(100));
}int main() {auto start = std::chrono::high_resolution_clock::now();safeFunction();auto end = std::chrono::high_resolution_clock::now();std::cout << "safeFunction took " << std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count() << " ms" << std::endl;start = std::chrono::high_resolution_clock::now();unsafeFunction();end = std::chrono::high_resolution_clock::now();std::cout << "unsafeFunction took " << std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count() << " ms" << std::endl;return 0;
}

输出:

safeFunction took 100 ms
unsafeFunction took 100 ms

虽然在这个简单的例子中性能差异不明显,但在复杂的程序中,noexcept可以显著提高性能。

4. 异常安全性

使用noexcept可以提高代码的异常安全性。标记为noexcept的函数不会抛出异常,因此调用这些函数的代码可以更加自信地使用不带RAII(资源获取即初始化)的代码。

代码示例:

#include <iostream>
#include <vector>class MyClass {
public:MyClass(int value) : value_(value) {}int value() const { return value_; }// 移动构造函数MyClass(MyClass&& other) noexcept : value_(other.value_) {other.value_ = 0;}// 移动赋值运算符MyClass& operator=(MyClass&& other) noexcept {if (this != &other) {value_ = other.value_;other.value_ = 0;}return *this;}private:int value_;
};void testMove() noexcept {std::vector<MyClass> vec;vec.reserve(10);for (int i = 0; i < 10; ++i) {vec.emplace_back(i);}std::vector<MyClass> vec2 = std::move(vec);
}int main() {testMove();return 0;
}

在这个例子中,MyClass的移动构造函数和移动赋值运算符都被标记为noexcept,这使得std::vector在进行内存重新分配等操作时可以安全地使用移动语义。

总结

noexcept是一个非常有用的特性,它可以帮助你编写更安全、更高效的代码。通过标记函数为noexcept,你可以告诉编译器这些函数不会抛出异常,从而让编译器进行优化。同时,noexcept也可以帮助你提高代码的异常安全性,特别是在使用移动语义时。

http://www.lryc.cn/news/578032.html

相关文章:

  • mysql 分组后时间没有按照最新时间倒序
  • 【知识分享】IIC协议详解
  • Flutter视频压缩插件video_compressffmpeg_kit_flutter_new
  • ffmpeg 安装 windows ubuntu
  • Prompt Enginering
  • vue-33(实践练习:使用 Nuxt.js 和 SSR 构建一个简单的博客)
  • 如何通过python脚本向redis和mongoDB传点位数据
  • 十大排序算法汇总
  • (5)pytest-yield操作
  • vscode一个文件夹有残余的git仓库文件,已经失效了,怎样进行清空仓库残余文件并重新初始化git--ubuntu
  • 灌区信息化渠道水位流量监测
  • 设计模式之享元模式深度解析
  • 如何在 iOS 上线前做好安全防护?IPA 混淆与逆向防护实践详解
  • 什么是集装箱残损识别系统?它如何提升港口效率?
  • AI 重塑开发范式:从工具进化到行业重构的深度实践​
  • mysql运维语句
  • 【Unity】MiniGame编辑器小游戏(七)贪吃蛇【Snake】
  • 链表题解——设计链表【LeetCode】
  • C#的datagridview使用总结
  • 复合电流检测方法:原理、技术与应用演进
  • 华为云Flexus+DeepSeek征文 | ​​华为云ModelArts Studio大模型与企业AI会议纪要场景的对接方案
  • GeoTools 结合 OpenLayers 实现属性查询(二)
  • Windows Excel文档办公工作数据整理小工具
  • Day2 音频基础知识
  • API接口安全-2:签名、时间戳与Token如何联手抵御攻击
  • starocks的be参数调优
  • 智能办公与科研革命:ChatGPT+DeepSeek大模型在论文撰写、数据分析与AI建模中的实践指南
  • vue常见问题:
  • 【解析】 微服务测试工具Parasoft SOAtest如何为响应式架构助力?
  • 阿里云计算巢私有化MCP市场:企业级AI工具的安全部署新选择