【C++知识点】C++20 常用新特性总结

您所在的位置:网站首页 c语言status怎么用 【C++知识点】C++20 常用新特性总结

【C++知识点】C++20 常用新特性总结

2023-03-14 01:42| 来源: 网络整理| 查看: 265

✍个人博客: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 int main() { std::cout 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) cout sort(s); //而不是 sort(vs.begin(), vs.end()); }

举个例子:

#include #include #include using namespace std; int main() { auto ints = views::iota(0, 10);//生成0-9 auto 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 2019 }; auto y2 = 2019y; //creating a mouth auto 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 p[i] = 7; //是否可行? } }

span 类模板就这样被放到 C++ 核心指南的支持库中。

void func(span a) { //span包含一个指针和一条大小信息 for (int& x : a) { x = 7; //可以 } }

范围 for 从跨度中提取范围,并准确地遍历正确数量的元素(无需代价高昂的范围检查)。这个例子说明了一个适当的抽象可以同时简化写法并提升性能。对于算法来说,相较于挨个检查每一个访问的元素,明确地使用一个范围(比如 span)要容易得多,开销也更低。

并发 std::promise

std::promise 和 std::future 是一对,通过它们可以进行更加灵活的任务控制。

promise 通过函数 set_value() 传入一个值,异常,或者通知,并异步的获取结果。

#include #include #include using namespace std; void product(promise&& intPromise, int v1, int v2) { intPromise.set_value(v1 * v2); } int main() { int num1 = 200; int num2 = 300; promise productPromise; future productResult = productPromise.get_future(); jthread productThread(product, move(productPromise), num1, num2); cout this_thread::sleep_for(2s); intPromise.set_value(100); } int main() { promise answerPromise; auto fut = answerPromise.get_future(); jthread productThread(getAnswer, move(answerPromise)); future_status status{}; do { status = fut.wait_for(0.5s); cout


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3