【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
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同一时刻只能执行一段代码。模拟的多线程就是任务之间快速切换,看起来像同时执行的样子。据说最近有多核的单片机,不过成本应该会高很多。对于模拟的多线程,我知道的有两种…...
【LeetCode】剑指 Offer(23)
目录 题目:剑指 Offer 46. 把数字翻译成字符串 - 力扣(Leetcode) 题目的接口: 解题思路: 代码: 过啦!!! 写在最后: 题目:剑指 Offer 46. 把…...
[免费专栏] 汽车威胁狩猎之不应该相信的几个威胁狩猎误区
也许每个人出生的时候都以为这世界都是为他一个人而存在的,当他发现自己错的时候,他便开始长大 少走了弯路,也就错过了风景,无论如何,感谢经历 汽车威胁狩猎专栏长期更新,本篇最新内容请前往: …...
LinuxFTP文件传输服务和DNS域名解析服务
♥️作者:小刘在C站 ♥️个人主页:小刘主页 ♥️每天分享云计算网络运维课堂笔记,努力不一定有收获,但一定会有收获加油!一起努力,共赴美好人生! ♥️夕阳下,是最美的绽放࿰…...
二叉搜索树原理及底层实现
二叉搜索树BST 概念 二叉搜索树又称二叉排序树,它可以是一棵空树,或者是具有以下性质的二叉树:若它的左子树不为空,则左子树上所有节点的值都小于根节点的值;若它的右子树不为空,则右子树上所有节点的值都…...
python自动化办公(一)
本文代码参考其他教程书籍实现。 文章目录文件读写open函数读取文本文件写入文本文件文件和目录操作使用os库使用shutil库文件读写 open函数 open函数有8个参数,常用前4个,除了file参数外,其他参数都有默认值。file指定了要打开的文件名称&a…...
LeetCode - 198 打家劫舍
目录 题目来源 题目描述 示例 提示 题目解析 算法源码 题目来源 198. 打家劫舍 - 力扣(LeetCode) 题目描述 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装…...
简单粗暴的分布式定时任务解决方案
分布式定时任务1.为什么需要定时任务?2.数据库实现分布式定时任务3.基于redis实现1.为什么需要定时任务? 因为有时候我们需要定时的执行一些操作,比如业务中产生的一些临时文件,临时文件不能立即删除,因为不清楚用户是…...
蓝桥杯第五天刷题
第一题:数的分解题目描述本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。把 2019 分解成 3 个各不相同的正整数之和,并且要求每个正整数都不包含数字 2和 4,一共有多少种不同的分解方法&…...
Java数组的定义和使用(万字详解)
目录 编辑 一. 数组的基本概念 1、什么是数组 2、数组的创建及初始化 1、数组的创建 2、数组的初始化 3、数组的使用 (1)数组中元素访问 (3)遍历数组 二、数组是引用类型 1、初始JVM的内存分布 2、基本类型变量与引用类…...
【SpringBoot】自定义Starter
🚩本文已收录至专栏:Spring家族学习之旅 👍希望您能有所收获 一.概述 在使用SpringBoot进行开发的时候,我们发现使用很多技术都是直接导入对应的starter,然后就实现了springboot整合对应技术,再加上一些简…...
wordpress开启redis缓存/免费建立网站
好久不写博客了,今天克服了心理障碍把如题的问题解决了,为了兄弟小论文的对比实验。 可能还不成熟,甚至有错误,至少不用一张一张修改保存。 相信很多刚上手图像处理的都有这个需求,po出来分享: 代码&…...
比较好的网站建设企业/百度搜索引擎seo
数据库中的变量time_of_last_update是datetime类型,我想要做的就是在表格中打印出来(下面),但理想情况下我想知道将来如何将其转换/转换为DateTime类型PHP,然后使用它上面的方法,如 – >格式等.做:$time_date $row[time_of_last_update];$time_date->format(…...
行政机关网站建设的意义/seo实战指导
光流的概念最早是由Gibson在1950年提出的。它是空间移动物体在像素观察平面中移动的瞬时速度。是一种计算物体在相邻帧间运动信息的方法。一般来说,光流(Optical Flow)是物体在三维空间中的运动在二维像平面上的投影。它是由物体和相机的相对速度产生的,…...
长沙网站建设规划/合肥网
1,报错提示: 编辑器或项目正在尝试签出在内存中修改的文件,这将导致保存该文件。 在生成过程中保存文件是危险的,这可能会在将来导致不正确的生成输出。 是否仍然继续签出? 2,原因:licenses.licx属性设为了只读. 3,解决: a,搜索licenses.licx,去掉只读属…...
怎么看一个网站是否做竞价/昆山优化外包
昨天看了微软2016Build大会,Xamarin免费了。恩,5亿美刀的家伙,哈哈,我也要体验一下..... 1. 首先在Xamarin官网下载安向导:https://www.xamarin.com/download 2. 点击运行后,按照自己的需要,选择…...
wordpress 制作论坛/seo矩阵培训
转自 https://blog.csdn.net/wspba/article/details/54577236 仅供参考,如有翻译不到位的地方敬请指出。 论文地址:Generative Adversarial Nets 论文翻译:XlyPb(http://blog.csdn.net/wspba/article/details/54577236ÿ…...