【C++知识点】C++20 常用新特性总结
✍个人博客:https://blog.csdn.net/Newin2020?spm=1011.2415.3001.5343
📚专栏地址:C/C++知识点
📣专栏定位:整理一下 C++ 相关的知识点,供大家学习参考~
❤️如果有收获的话,欢迎点赞👍收藏📁,您的支持就是我创作的最大动力💪
🎏唠叨唠叨:在这个专栏里我会整理一些琐碎的 C++ 知识点,方便大家作为字典查询~
C++20 新特性
模块
从 C 语言中,C++ 继承了 #include 机制,依赖从头文件使用文本形式包含 C++ 源代码,这些头文件中包含了接口的文本定义。一个流行的头文件可以在大型程序的各个单独编译的部分中被 #include 数百次。基本问题是:
(1) 不够卫生:一个头文件中的代码可能会影响同一翻译单元中包含的另一个 #include 中的代码的含义,因此 #include 并非顺序无关。宏是这里的一个主要问题,尽管不是唯一的问题。
(2) 分离编译的不一致性:两个翻译单元中同一实体的声明可能不一致,但并非所有此类错误都被编译器或链接器捕获。
(3) 编译次数过多:从源代码文本编译接口比较慢。从源代码文本反复地编译同一份接口非常慢。
所以,在 C++ 程序中改进模块化是一个迫切的需求。
#include <iostream>
int main() {std::cout << "Hello, C++!" << std::endl;
}
这段标准代码有 70 个左右的字符,但是在 #include 之后,它会产生 419909 个字符需要编译器来消化。尽管现代 C++ 编译器已有傲人的处理速度,但模块化问题已经迫在眉睫。
模块化是什么意思?顺序独立性:import X; import Y; 应该与 import Y; import X; 相同。
换句话说,任何东西都不能隐式地从一个模块“泄漏”到另一个模块。
这是 #include 文件的一个关键问题。
#include 中的任何内容都会影响所有后续的 #include。
顺序独立性是“代码卫生”和性能的关键。
C++ 20 中正式引入了模块的概念,模块是一个用于在翻译单元间分享声明和定义的语言特性。它们可以在某些地方替代使用头文件。
其主要优点如下:
-
没有头文件。
-
声明实现仍然可分离,但非必要。
-
可以显式指定导出哪些类或函数。
-
不需要头文件重复引入宏(include guards)。
-
模块之间名称可以相同,并且不会冲突。
-
模块只处理一次,编译更快(头文件每次引入都需要处理,需要通过 pragma once 约束)。
-
预处理宏只在模块内有效。
-
模块的引入与引入顺序无关。
创建模块
源文件->添加->新建项->Module
创建 ***.ixx 文件
//创建模块
// mymodule.ixx //模块名和文件名没有强制要求,一般会相同
export module helloworld; //模块声明
import <iostream>; //导入声明 注意;号
export void hello() { //导出声明std::cout << "Hello world!\n";
}//导入模块
//main.cpp
import helloworld; //导入声明
int main() {hello();
}
协程
协程就是一个可以挂起(suspend)和恢复(resume)的函数(不能是 main 函数)。你可以暂停协程的执行, 去做其他事情,然后在适当的时候恢复到暂停的位置继续执行。协程让我们使用同步方式写异步代码。
C++ 提供了三个方法挂起协程:co_await, co_yield 和 co_return。
C++20 协程只是提供协程机制,而不是提供协程库。C++20 的协程是无栈协程,无栈协程是一个可以挂起/恢复的特殊函数,是函数调用的泛化,且只能被线程调用,本身并不抢占内核调度。
C++20 提供了三个新关键字(co_await、co_yield 和 co_return),如果一个函数中存在这三个关键字之一,那么它就是一个协程。
co_yield some_value:保存当前协程的执行状态并挂起,返回 some_value 给调用者。
co_await some_awaitable:如果 some_awaitable 没有 ready,就保存当前协程的执行状态并挂起。
co_return some_value:彻底结束当前协程,返回 some_value 给协程调用者。
<=> 三向比较运算符
也叫三路比较运算符,三路比较结果如下:
- (a <=> b) < 0 // 如果 a < b,则为 true
- (a <=> b) > 0 // 如果 a > b,则为 true
- (a <=> b) == 0 // 如果 a 与 b 相等或者等价,则为 true
类似于 C 的 strcmp 函数返回 -1, 0, 1。
一般情况:自动生成所有的比较操作符,如果对象是结构体则逐个比较,可以用下面代码代替所有的比较运算符:
auto X::operator<=>(const Y&) = default;
高级情况:指定返回类型(支持 6 种所有的比较运算符)
int num1 = 100, num2 = 100;
if ((num1 <=> num2) < 0) {cout << "num1 < num2" << endl;
}
else if ((num1 <=> num2) > 0) {cout << "num1 > num2" << endl;
}
else {cout << "num1 = num2" << endl;
}
范围 ranges
范围库始于 Eric Niebler 对 STL 序列观念的推广和现代化的工作。它提供了更易于使用、更通用及性能更好的标准库算法。
例如,C++20 标准库为整个容器的操作提供了期待已久的更简单的表示方法。
void func1(vector<string>& s) {sort(s); //而不是 sort(vs.begin(), vs.end());
}
举个例子:
#include <vector>
#include <ranges>
#include <iostream>
using namespace std;
int main()
{auto ints = views::iota(0, 10);//生成0-9auto even = [](int i) { return 0 == i % 2; };auto square = [](int i) { return i * i; };for (int i : ints | views::filter(even) | views::transform(square))cout << i << ' ';return 0;
}
日期和时区
日期库是日期库是多年工作和实际使用的结果,它基于 chrono 标准库的时间支持。在 2018 年,它进入了 C++20,并和旧的时间工具一起放在中。
#include <iostream>
#include <chrono>
using namespace std;
using namespace std::chrono;
int main()
{//creating a year auto y1 = year{ 2019 };auto y2 = 2019y;//creating a mouthauto m1 = month{ 9 };auto m2 = September;//creating a day auto d1 = day{ 18 };auto d2 = 18d;year_month_day date1{ 2022y,July, 21d };auto date2 = 2022y / July / 21d;chrono::year_month_day date3{ Monday[3] / July / 2022 };cout << date1 << endl;cout << date2 << endl;cout << date3 << endl;return 0;
}
格式化
iostream 库提供了类型安全的 I/O 的扩展,但是它的格式化工具比较弱。
另外,还有的人不喜欢使用 << 分隔输出值的方式。
格式化库提供了一种类 printf 的方式去组装字符串和格式化输出值,同时这种方法类型安全、快捷,并能和 iostream 协同工作。
类型中带有 << 运算符的可以在一个格式化的字符串中输出。
string s1 = "C++";
cout << format("The string '{}' has {} characters", s1, s1.size());
cout << format("The string '{0}' has {1} characters", s1, s1.size()) << endl;
cout << format("The string '{1}' has {0} characters", s1.size(), s1) << endl;
跨度
越界访问,有时也称为缓冲区溢出,从 C 的时代以来就一直是一个 严重的问题。考虑下面的例子:
void func1(int* p, int n) { //n是什么?for (int i = 0; i < n; ++i) {p[i] = 7; //是否可行?}
}
span 类模板就这样被放到 C++ 核心指南的支持库中。
void func(span<int> a) { //span包含一个指针和一条大小信息for (int& x : a) {x = 7; //可以}
}
范围 for 从跨度中提取范围,并准确地遍历正确数量的元素(无需代价高昂的范围检查)。这个例子说明了一个适当的抽象可以同时简化写法并提升性能。对于算法来说,相较于挨个检查每一个访问的元素,明确地使用一个范围(比如 span)要容易得多,开销也更低。
并发
std::promise
std::promise 和 std::future 是一对,通过它们可以进行更加灵活的任务控制。
promise 通过函数 set_value() 传入一个值,异常,或者通知,并异步的获取结果。
#include <iostream>
#include <future>
#include <format>
using namespace std;
void product(promise<int>&& intPromise, int v1, int v2) {intPromise.set_value(v1 * v2);
}
int main() {int num1 = 200;int num2 = 300;promise<int> productPromise;future<int> productResult = productPromise.get_future();jthread productThread(product, move(productPromise), num1, num2);cout << format("product is {}\n", productResult.get());
}
std::future
- 从 promise 获取值
- 询问值是否可用
- 等待通知
- 创建 shared_future
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2OU3aHa7-1678669593497)(C++笔记.assets/image-20230304141825224.png)]](https://img-blog.csdnimg.cn/b4c6754f4f7e4102959a941c040dd9e6.png)
std::future_status
调用后 wait_for 或者 wait_until 返回的结果。
enum class future_status
{ready, //成功timeout, //超时deferred //延迟
};
案例
#include <iostream>
#include <future>
#include <format>
using namespace std;
void getAnswer(promise<int> intPromise)
{this_thread::sleep_for(2s);intPromise.set_value(100);
}
int main()
{promise<int> answerPromise;auto fut = answerPromise.get_future();jthread productThread(getAnswer, move(answerPromise));future_status status{};do{status = fut.wait_for(0.5s);cout << "结果未准备完成 " << endl;} while (status != future_status::ready);cout << format("answer is {}\n ", fut.get());
}
相关文章:
【C++知识点】C++20 常用新特性总结
✍个人博客:https://blog.csdn.net/Newin2020?spm1011.2415.3001.5343 📚专栏地址:C/C知识点 📣专栏定位:整理一下 C 相关的知识点,供大家学习参考~ ❤️如果有收获的话,欢迎点赞👍…...
数据库体系结构概念--集中式数据库、分布式数据库
数据库模式 前言: 平时我们接触的‘数据库’一般指的是DBMS,数据库管理系统,DBMS是软件如:mysql、oracle、dm等等都是集中式数据库,但它们不能代表整个数据库,只是通过这些软件来管理相应的数据内容&#…...
PyQt5数据库开发2 5.2 QSqlRelationalTableModel
目录 一、Qt窗体设计 1. 新建Qt项目 2. 添加组件 3. 添加资源 4. 添加Action 5. 添加工具栏 6. 添加菜单项 7. 添加退出功能 二、SQL Server下建表插数据 1. 建立表 2. 插入数据 3. 单表数据 4. 联合查询 三、代码实现 1. 新建项目目录 2. 编译窗体文件和资…...
树莓派——智能家居第一步
辛辛苦苦配了成功让树莓派开始工作了,开始搞智能家居!大体思路:基于工厂模式,分模块来实现上图分为三部分:主控、外设、控制主控我采用的是树莓派的4b4G版本,外设包括四个区域的灯(我的和上图有…...
【Golang】Golang基础入门级教程 -- 0基础安装搭建Go语言开发环境
目录 安装和下载GO语言 下载 下载地址 版本的选择 安装 Windows安装 Linux下安装 Mac下安装 检查 GOROOT和GOPATH GOPROXY Go开发编辑器 VS Code介绍 下载与安装 配置 Go扩展 第一个Go程序 Hello World go mod init 编写 编译 VSCode切换默认终端 本篇文章…...
MATLAB | 如何解决实验数据散点图重叠问题(overlap)
本期部分实验效果: 这期讲一下如果数据重合严重该咋办(overlap),事先说明,本文中的绘图均使用一个几行的简单小代码进行了修饰: function defualtAxes axgca;hold on;box on ax.XGridon; ax.YGridon; ax.XMinorTickon; ax.YMinor…...
Kubernetes 一键部署利器:kubeadm
文章目录集群部署痛点kubeadm 的工作原理kubeadm init 的工作流程kubeadm join 的工作流程kubeadm 的部署配置参数集群部署痛点 Kubernetes 的部署一直以来都是挡在初学者前面的一只“拦路虎”。尤其是在 Kubernetes 项目发布初期,它的部署完全要依靠一堆由社区维护…...
[jS 事件循环理解] 主线程 宏任务 微任务 - 执行顺序优先级理解
最近看了一个帖子 事件循环机制-宏任务-微任务 把js单线程中 , 主线程 | 宏任务 | 微任务 的调用顺序讲解的很直白精巧 , 记录一下以供查阅 1.主线程, 可以理解为从上到下顺序执行的一个js线程 2. 宏任务 script / setTimeOut /setInterval等 3. 微任务主要有promise等 4. 热…...
顺序表和链表的比较
这两个结构各有优势,相辅相成。 顺序表: 优点: 1.支持随机访问。 2.CPU高速缓存命中率更高。(物理空间连续) 缺点: 1.头部和中部插入和删除时间效率低(O(n))。 2.连续的物理空间,空间不够后需要增容:…...
Java为什么只能单继承???
目录 先屡清楚继承和实现的区别: 分析原因: 多继承虽然能使子类同时拥有多个父类的特征,但是其缺点也是很显著的,主要有两方面: (1)如果在一个子类继承的多个父类中拥有相同名字的实例变量,子类在引用该…...
数据安全-分类分级 调研分析报告
目录 前言一、数据分类分级概述1.数据分类2.数据分级二、数据分类分级原则三、数据分类分级的框架和方法1.数据分类分级的框架2.分类标准分类常见的方法2.1 MECE2.2 线分法和面分法及混合分法2.3 数据主题域2.4 技术选型维度2.5 以业务应用维度2.6 信息安全隐私方面的分类法3.分…...
浏览器对象详解
文章目录浏览器对象详解一、参考资料二、认识浏览器运行态下的 js1.问:是否了解浏览器的执行态(分层设计)?2.BOM1.[location](https://developer.mozilla.org/zh-CN/docs/Web/API/Location)拓展方向:2.[History](https…...
异步电路后端实现流程(cdc signOff 后端做什么)
一种后端异步电路的signOff流程同步电路和异步电路分别signOff对于同步电路,后端会分析sta setup/hold,这里不在赘述。在该scenario下 异步电路是不会分析,也不会关注异步电路之间的走线在cdc scenario(mode)下sdc有一下设置:将所…...
Linux网络编程实战介绍
文章目录 前言一、Linux网络编程介绍二、文章目录总结前言 本专栏将为大家讲解Linux网络编程的知识,本专栏只需要有C语言基础即可学习,学习本专栏将大大提高你的C语言水平,当然了我也还会在ARM板子上进行实验将Linux驱动也和网络编程联系起来,方便大家去实现自己的项目。我…...
C++概述 课堂笔记
函数的重载在C语言中函数名是唯一的,不可以重复定义,当我们利用函数执行,功能相似的函数,我们也不能使用同一个函数,比如说,求整型的函数,不能用来求浮点型、字符型。在C中引入函数重载的概念&a…...
一文读懂SpringBoot整合Elasticsearch(一)
(本篇文章主要介绍Spring Boot如何整合Elasticsearch,包括基本配置、数据操作、搜索功能等方面。) 一、前言 Elasticsearch是一款全文搜索引擎,可用于快速、准确地存储、搜索和分析大量数据。而Spring Boot是一款快速开发框架&a…...
(数论)(枚举)(前缀和)1230. K倍区间
目录 题目链接 一些话 切入点 流程 套路 ac代码 题目链接 1230. K倍区间 - AcWing题库 ~数~啦!我草,又~在~水~字~数~啦!我草,又~在~水&…...
万字带你深入理解 Linux 虚拟内存管理(下)
接上文:万字带你深入理解 Linux 虚拟内存管理(上) 6. 程序编译后的二进制文件如何映射到虚拟内存空间中 经过前边这么多小节的内容介绍,现在我们已经熟悉了进程虚拟内存空间的布局,以及内核如何管理这些虚拟内存区域&…...
【iOS】—— JSONModel源码学习
JSONModel 文章目录JSONModel关于JSONModel的用法initWithDictionary等方法load方法实现load方法调用时机init方法__setup__方法__inspectProperties:方法__doesDictionary方法__importDictionary方法关于JSONModel的用法 可以参考之前写的博客:【iOS】—— JSONMo…...
单片机怎么实现真正的多线程?
所谓多线程都是模拟的,本质都是单线程,因为cpu同一时刻只能执行一段代码。模拟的多线程就是任务之间快速切换,看起来像同时执行的样子。据说最近有多核的单片机,不过成本应该会高很多。对于模拟的多线程,我知道的有两种…...
接口测试中缓存处理策略
在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...
java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别
UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...
蓝桥杯 2024 15届国赛 A组 儿童节快乐
P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡,轻快的音乐在耳边持续回荡,小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下,六一来了。 今天是六一儿童节,小蓝老师为了让大家在节…...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...
pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...
mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...
企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...
SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...
基于TurtleBot3在Gazebo地图实现机器人远程控制
1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...
深度学习水论文:mamba+图像增强
🧀当前视觉领域对高效长序列建模需求激增,对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模,以及动态计算优势,在图像质量提升和细节恢复方面有难以替代的作用。 🧀因此短时间内,就有不…...
