编程参考 - 在C++移动构造函数声明中使用noexcept
在 C++ 中,noexcept 是用于表示函数不抛出异常的指定符。它既可用于常规函数,也可用于特殊成员函数,包括构造函数和析构函数。使用 noexcept 可以帮助编译器进行优化,提高代码的安全性和正确性。
In C++, noexcept is a specifier used to indicate that a function does not throw exceptions. It can be applied to both regular functions and special member functions, including constructors and destructors. Using noexcept helps the compiler make optimizations and can improve the safety and correctness of the code.
Usage of noexcept
1, Declaring Non-Throwing Functions:
void func() noexcept {
// Function implementation
}
2, Conditional noexcept:
You can specify that a function is noexcept based on a condition, typically an expression that evaluates to true or false at compile time.
template <typename T>
void func(T t) noexcept(noexcept(t.method())) {
t.method();
}
In this example, func is declared noexcept if t.method() is noexcept.
3, Move Constructor and Move Assignment Operator:
Declaring move constructors and move assignment operators as noexcept is a common practice, especially if they do not throw exceptions. This allows standard library containers, like std::vector, to use more efficient operations for moving elements.
class MyClass {
public:
MyClass(MyClass&&) noexcept = default;
MyClass& operator=(MyClass&&) noexcept = default;
};
Benefits of noexcept
1, Performance:
标记为 noexcept 的函数允许编译器执行某些优化,如内联和减少异常处理的开销。
Functions marked as noexcept can allow the compiler to perform certain optimizations, such as inlining and reducing the overhead of exception handling.
2, Exception Safety:
通过将函数标记为 noexcept,可以保证它们不会抛出异常。这在析构函数、移动操作和代码的关键部分特别有用,因为在这些地方异常会造成问题。
By marking functions as noexcept, you provide a guarantee that they will not throw exceptions. This can be particularly useful in destructors, move operations, and critical sections of code where exceptions would be problematic.
3, Standard Library Interactions:
许多标准库算法和容器都可以利用 noexcept 保证来选择更高效的代码路径。例如,如果移动构造函数是 noexcept 的,std::vector 就可以在重新分配时不会考虑出现异常的风险,从而提高性能。
Many standard library algorithms and containers can take advantage of noexcept guarantees to choose more efficient code paths. For example, if a move constructor is noexcept, std::vector can use it during reallocation without the risk of exceptions, leading to better performance.
Example
Here is a complete example demonstrating the use of noexcept:
#include <iostream>
#include <vector>
class MyClass {
public:
MyClass() {
// Constructor
}
~MyClass() {
// Destructor
}
// Copy constructor
MyClass(const MyClass&) {
// Copy logic
}
// Move constructor (noexcept)
MyClass(MyClass&&) noexcept {
// Move logic
}
// Copy assignment operator
MyClass& operator=(const MyClass&) {
// Copy assignment logic
return *this;
}
// Move assignment operator (noexcept)
MyClass& operator=(MyClass&&) noexcept {
// Move assignment logic
return *this;
}
void display() const noexcept {
std::cout << "MyClass instance" << std::endl;
}
};
int main() {
std::vector<MyClass> vec;
vec.push_back(MyClass()); // Uses move constructor
MyClass obj;
obj.display(); // Calls noexcept function
return 0;
}
In this example:
-
MyClass 的移动构造函数和移动赋值运算符被标记为 noexcept。
-
显示函数被标记为 noexcept,因为它不会抛出任何异常。
-
std::vector 可以根据 MyClass 的 noexcept 移动构造函数和移动赋值操作符优化其操作。
-
The move constructor and move assignment operator of MyClass are marked as noexcept.
-
The display function is marked as noexcept because it does not throw any exceptions.
-
The std::vector can optimize its operations based on the noexcept move constructor and move assignment operator of MyClass.
std::vector::push_back在处理临时对象时使用移动构造函数,前提是移动构造函数标记为 noexcept。
The std::vector class has different overloads of the push_back function:
* One that takes a const T& (copy constructor).
* One that takes a T&& (move constructor).
void push_back(const T& value); // For copy
void push_back(T&& value); // For move
std::vector::push_back uses the move constructor when dealing with a temporary object, provided the move constructor is marked noexcept. The compiler will prefer the rvalue reference overload (push_back(T&&)), which uses the move constructor.
Why Move Constructor is Used
* 临时对象: 临时对象(rvalues)是移动操作的理想候选对象,因为它们即将被销毁,因此其资源可以被 "移动 "而不是复制。
* 效率高: 移动通常比复制更有效率,特别是对于管理动态内存或其他资源的对象。
* 标准库要求: 标准库中的容器(如 std::vector)在可用和 noexcept 时都会使用 move 构造函数。
* Temporary Objects: Temporary objects (rvalues) are ideal candidates for move operations because they are about to be destroyed, and thus their resources can be "moved" rather than copied.
* Efficiency: Moving is typically more efficient than copying, especially for objects that manage dynamic memory or other resources.
* Standard Library Requirements: The standard library containers (like std::vector) are designed to use the move constructor when available and when it is noexcept.
相关文章:

编程参考 - 在C++移动构造函数声明中使用noexcept
在 C 中,noexcept 是用于表示函数不抛出异常的指定符。它既可用于常规函数,也可用于特殊成员函数,包括构造函数和析构函数。使用 noexcept 可以帮助编译器进行优化,提高代码的安全性和正确性。 In C, noexcept is a specifier use…...

Vue2/Vue3实现全局/局部添加防篡改水印的效果。删除元素无效!更改元素属性无效!支持图片、元素、视频等等。
水印目的 版权保护:水印可以在图片、文档或视频中嵌入作者、品牌或版权所有者的信息,以防止未经授权的复制、传播或使用。当其他人使用带有水印的内容时,可以追溯到原始作者或版权所有者,从而加强版权保护。 身份识别:水印可以用作作者或品牌的标识符,使观众能够轻松识…...

GuLi商城-商品服务-API-属性分组-获取分类属性分组
获取分类属性分组接口开发 操作的是这张表 造数据: 后台代码: @Override public PageUtils queryPage(Map<String, Object> params, Long catelogId) {//select * from pms_attr_group where catelog_id=? and (attr_group_id=key or attr_group_name like %key%)Stri…...

安全测试理论
安全测试理论 什么是安全测试? 安全测试:发现系统安全隐患的过程安全测试与传统测试区别 传统测试:发现bug为目的 安全测试:发现系统安全隐患什么是渗透测试 渗透测试:已成功入侵系统为目标的的攻击过程渗透测试与安全…...

序列化和反序列化
面试题:对序列化和反序列化的理解? 我们之所以需要序列化,它核心的目的是为了解决网络通信之间的对象传输的问题,也就是说,如何把当前JVM进程的一个对象,通过跨网络传输到另一个JVM进程里面,而序…...

OpenCV中使用Canny算法在图像中查找边缘
操作系统:ubuntu22.04OpenCV版本:OpenCV4.9IDE:Visual Studio Code编程语言:C11 算法描述 Canny算法是一种广泛应用于计算机视觉和图像处理领域中的边缘检测算法。它由John F. Canny在1986年提出,旨在寻找给定噪声条件下的最佳边…...

基于springboot+vue+uniapp的机电公司管理信息系统
开发语言:Java框架:springbootuniappJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包&#…...

电子期刊制作实战教程:从零开始制作
随着互联网的普及,电子期刊已经成为了信息传递的重要载体。它以便捷、环保、互动性强等特点受到了越来越多人的青睐。那么,如何从零开始制作一份吸引人的电子期刊呢? 1.要制作电子杂志,首先需要选择一款适合自己的软件。比如FLBOOK在线制作…...

11.FreeRTOS_事件组
事件组概述 事件组的作用: 可以等待某一个事件发生可以等待若干个事件发生可以等待若干个事件中的某一个事件发生 同步点是事件组的另一个使用方式,它可以让多个任务进行阻塞等待,当全部事件完成后,再一起解除任务的阻塞。常常…...

Python爬虫-爬取三国演义文本数据-bs4
bs4进行数据解析 -数据解析的原理: - 1.标签定位 -2.提取标签、标签属性中存储的数据值 - bs4数据解析的原理: - 1.实例化一个BeautifulSoup对象,并且将页面源码数据加载到该对象中 -2.通过调用BeautifulSoup对象中相关的属性或者方法进行标签定位和数据提取 - 环境安装: - pi…...

html5——列表、表格
目录 列表 无序列表 有序列表 自定义列表 表格 基本结构 示例 表格的跨列 表格的跨行 列表 无序列表 <ul>【声明无序列表】 <li>河间驴肉火烧</li>【声明列表项】 <li>唐山棋子烧饼</li> <li>邯郸豆沫</li> <l…...

【Python字符串攻略】:玩转文字,编织程序的叙事艺术
文章目录 🚀一.字符串基础🌈二.查看数据类型⭐三.转化❤️四.字符串索引🚲五.字符串切片🎬六.字符串切片-步长☔七.反向切片注意事项🚲八.字符串💥查💥改💥删 ❤️九.字符串拼接&…...

element form表单中密码框被自动赋值,并默认背景色为白色,手动输值后背景色才是自己配置的背景色,与表单的自动填充有关
事件背景: 一个表单,有两组需要输入密码的地方,两组都被填充用户名密码,其中一组是其他信息,不是用户名密码,也被填充了,且input背景色是白色,表单中的input已经手动配置为无背景色&…...

【UE5.1 角色练习】15-枪械射击——子弹发射物
目录 效果 步骤 一、创建并发射子弹 二、优化子弹 效果 步骤 一、创建并发射子弹 1. 在前面的文章中(【UE5.1 角色练习】06-角色发射火球-part1)我们创建了蓝图“BP_Skill_FireBall” 这里我们复制一份命名为“BP_Ammo_5mm”,用于表示…...

Zynq7000系列FPGA中的DMA控制器的编程限制
有关DMAC编程时适用的限制信息,有四个考虑因素: 固定非对齐突发Endian swap size restrictions:在数据传输或处理过程中,不同字节序(Endian)之间的转换和对应的限制在DMA周期内更新通道控制寄存器当MFIFO满…...

超简易高效的 AI绘图工具—与sd-webui一致界面,6G显存最高提升75%出图速率!(附安装包)
大家好,我是灵魂画师向阳 今天给大家分享一个基于Stable Diffusion WebUI 构建的AI绘图工具—sd-webui-forge,该工具的目标在于简化插件开发,优化资源管理,加速推理。 Forge承诺永远不会对Stable Diffusion WebUI用户界面添加不…...

ArduPilot开源代码之OpticalFlow_backend
ArduPilot开源代码之OpticalFlow_backend 1. 源由2. Library设计3. 重要例程3.1 OpticalFlow_backend::_update_frontend3.2 OpticalFlow_backend::_applyYaw 4. 总结5. 参考资料 1. 源由 光流计是一种低成本定位传感器,所有的光流计设备传感驱动代码抽象公共部分统…...

设计模式探索:适配器模式
1. 适配器模式介绍 1.1 适配器模式介绍 适配器模式(adapter pattern)的原始定义是:将一个类的接口转换为客户期望的另一个接口,适配器可以让不兼容的两个类一起协同工作。 适配器模式的主要作用是把原本不兼容的接口,…...

OpenCV 寻找棋盘格角点及绘制
目录 一、概念 二、代码 2.1实现步骤 2.2完整代码 三、实现效果 一、概念 寻找棋盘格角点(Checkerboard Corners)是计算机视觉中相机标定(Camera Calibration)过程的重要步骤。 OpenCV 提供了函数 cv2.findChessboardCorners…...

【深度学习】PyTorch深度学习笔记02-线性模型
1. 监督学习 2. 数据集的划分 3. 平均平方误差MSE 4. 线性模型Linear Model - y x * w 用穷举法确定线性模型的参数 import numpy as np import matplotlib.pyplot as pltx_data [1.0, 2.0, 3.0] y_data [2.0, 4.0, 6.0]def forward(x):return x * wdef loss(x, y):y_pred…...

10.FreeRTOS_互斥量
互斥量概述 在博文“ FreeRTOS_信号量 ”中,使用了二进制信号量实现了互斥,保护了串口资源。博文链接如下: FreeRTOS_信号量-CSDN博客 但还是要引入互斥量的概念。互斥量与二进制信号量相比,能够多实现如下两个功能:…...

EtherCAT总线冗余让制造更安全更可靠更智能
冗余定义 什么是总线冗余功能?我们都知道,EtherCAT现场总线具有灵活的拓扑结构,设备间支持线型、星型、树型的连接方式,其中线型结构简单、传输效率高,大多数的现场应用中也是使用这种连接方式,如下图所示…...

Android IdleHandler源码分析
文章目录 Android IdleHandler源码分析概述前提基本用法源码分析添加和删除任务执行任务 应用场景 Android IdleHandler源码分析 概述 IdleHandler是一个接口,它定义在MessageQueue类中,用于在主线程的消息队列空闲时执行一些轻量级的任务。IdleHandle…...

Mac安装stable diffusion 工具
文章目录 1.安装 Homebrew2.安装 stable diffusion webui 的依赖3.下载 stable diffusion webui 代码4.启动 stable diffusion webui 本体5.下载模型6.这里可能会遇到一个clip-vit-large-patch14报错 参考:https://brew.idayer.com/install/stable-diffusion-webui/…...

CVE-2024-6387Open SSH漏洞彻底解决举措(含踩坑内容)
一、漏洞名称 OpenSSH 远程代码执行漏洞(CVE-2024-6387) 二、漏洞概述 Open SSH是基于SSH协议的安全网络通信工具,广泛应用于远程服务器管理、加密文件传输、端口转发、远程控制等多个领域。近日被爆出存在一个远程代码执行漏洞,由于Open SSH服务器端…...

python的简单爬取
需要的第三方模块 requests winr打开命令行输入cmd 简单爬取的基本格式(爬取百度logo为例) import requests url"http://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png" resprequests.get(url)#回应 #保存到本地 with open(&…...

【WEB前端2024】3D智体编程:乔布斯3D纪念馆-第60集-agent训练资讯APP重点推荐AI资讯内容(含视频)
【WEB前端2024】3D智体编程:乔布斯3D纪念馆-第60集-agent训练资讯APP重点推荐AI资讯内容(含视频) 使用dtns.network德塔世界(开源的智体世界引擎),策划和设计《乔布斯超大型的开源3D纪念馆》的系列教程。d…...

【学术会议征稿】第三届智能电网与能源系统国际学术会议
第三届智能电网与能源系统国际学术会议 2024 3rd International Conference on Smart Grid and Energy Systems 第三届智能电网与能源系统国际学术会议(SGES 2024)将于2024年10月25日-27日在郑州召开。 智能电网可以优化能源布局,让现有能源…...

01. 课程简介
1. 课程简介 本课程的核心内容可以分为三个部分,分别是需要理解记忆的计算机底层基础,后端通用组件以及需要不断编码练习的数据结构和算法。 计算机底层基础可以包含计算机网络、操作系统、编译原理、计算机组成原理,后两者在面试中出现的频…...

iOS热门面试题(三)
面试题1:在iOS开发中,什么是MVC设计模式?请详细解释其各个组成部分,并给出一个实际应用场景,包括具体的代码实现。 答案: MVC设计模式是一种在软件开发中广泛使用的架构模式,特别是在iOS开发中…...