news 2026/10/19 9:30:51

C++20最重要的三个新特性

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++20最重要的三个新特性

博主介绍:程序喵大人

  • 35 - 资深C/C++/Rust/Android/iOS客户端开发
  • 10年大厂工作经验
  • 嵌入式/人工智能/自动驾驶/音视频/游戏开发入门级选手
  • 《C++20高级编程》《C++23高级编程》等多本书籍著译者
  • 更多原创精品文章,首发gzh,见文末
  • 👇👇记得订阅专栏,以防走丢👇👇
    😉C++基础系列专栏
    😃C语言基础系列专栏
    🤣C++大佬养成攻略专栏
    🤓C++训练营
    👉🏻个人网站

C++之父都说过,C++20是C++语言的一次重大变革,引入了大量的新特性。

这其中个人认为最重要新特性是这三个:
Modules、Coroutines、Concepts

Modules

直接看代码:

// helloworld.ixxexportmodulehelloworld;// module declarationimport<iostream>;// import declarationexportvoidhello(){// export declarationstd::cout<<"Hello world!\n";}// main.cppimporthelloworld;// import declarationintmain(){hello();}

每个C++开发者应该都知道include方式是将header中的代码拷贝一份到源文件中,在大的工程项目中还有很多冗余的include,种种原因,导致编译速度相当的慢,而modules却大大改善了这种问题。

modules使用方式和include差不多,但modules使用比include头文件速度更快,C++全球开发者大会中,C++之父贴出来过测试数据,modules效率比include高了25倍。以后modules肯定会是主流使用方式。

Coroutines

协程是一种比线程和进程更高效的多任务处理模型。

在C++20中,终于把协程引了进来,协程具体还分为有栈协程和无栈协程,两者对比,无栈协程是更高效的协程。

而C++20支持的就是无栈协程,为此提供了三个关键字:

  • co_await:暂停执行,直到恢复
  • co_yield:暂停执行,返回一个值
  • co_return:完成执行,返回一个值

这是一段cppreference上,协程相关的示例代码:

#include<coroutine>#include<iostream>#include<stdexcept>#include<thread>autoswitch_to_new_thread(std::jthread&out){structawaitable{std::jthread*p_out;boolawait_ready(){returnfalse;}voidawait_suspend(std::coroutine_handle<>h){std::jthread&out=*p_out;if(out.joinable())throwstd::runtime_error("Output jthread parameter not empty");out=std::jthread([h]{h.resume();});// Potential undefined behavior: accessing potentially destroyed *this// std::cout << "New thread ID: " << p_out->get_id() << '\n';std::cout<<"New thread ID: "<<out.get_id()<<'\n';// this is OK}voidawait_resume(){}};returnawaitable{&out};}structtask{structpromise_type{taskget_return_object(){return{};}std::suspend_neverinitial_suspend(){return{};}std::suspend_neverfinal_suspend()noexcept{return{};}voidreturn_void(){}voidunhandled_exception(){}};};taskresuming_on_new_thread(std::jthread&out){std::cout<<"Coroutine started on thread: "<<std::this_thread::get_id()<<'\n';co_awaitswitch_to_new_thread(out);// awaiter destroyed herestd::cout<<"Coroutine resumed on thread: "<<std::this_thread::get_id()<<'\n';}intmain(){std::jthread out;resuming_on_new_thread(out);}

目前C++20只是从语法层面对协程做了支持,还没有相关的协程库,要想使用协程,还需要引入协程库,但不可否认,C++20已经支持了协程,以后在这方面肯定会越来越完善。

之前参加的C++全球开发者大会,C++之父也说过会全力在C++23标准中引入对协程库的支持。

Concepts

Concepts在模板编程中起到重大的作用,类模板、函数模板和非模板函数(通常是类模板的成员)可以与一个约束相关联,这个约束指定了对模板实参的要求,这些实参可用于选择最合适的函数重载和模板特化。

很多人应该都知道SFINAE,在C++20前多数都在使用std::enable_if,这相当的麻烦,代码可读性也不高,编译器报错信息也不是很友好,而有了Concepts就方便的多。每个Concepts都是一个谓词,在编译时计算,并成为模板接口的一部分,在那里它被用作约束:

#include<string>#include<cstddef>#include<concepts>template<typenameT>conceptHashable=requires(T a){{std::hash<T>{}(a)}->std::convertible_to<std::size_t>;};structmeow{};// Constrained C++20 function template:template<Hashable T>voidf(T){}intmain(){usingstd::operator""s;f("abc"s);// OK, std::string satisfies Hashable//f(meow{}); // Error: meow does not satisfy Hashable}

其实C++20还有一些特性我比较喜欢,比如std::jthread,真真切切的解决了std::thread存在的旧有问题。还有fmt,因为cout方式输出复杂的格式很麻烦:

std::cout<<a<<" + "<<b<<" = "<<c<<std::endl;

是不是很麻烦,那可以使用printf?

printf("%d + %d = %d \n",a,b,c);

但printf需要开发者填入变量格式,如果填写有误,有可能打印错误,也有可能crash:某个long long 型,使用%d打印会怎么样?某个int32_t型,使用%lld打印会怎么样?某个const char* 型,使用%d打印会怎么样?某个float型,使用%d打印会怎么样?

所以使用printf会给开发者带来负担,一定要在打印前确认变量的类型,并且一定要保证配置的输出格式正确,我想大多数人可能都会在print某个变量前搜索过打印某个类型需要使用哪种格式吧?那用啥呢?cout配合format。

std::cout<<std::format("{} + {} = {} \n",a,b,c);

C++20其实还有很多有意思的新特性,而这些特性在这本《C++20高级编程(第5版)》中都有详细的介绍,大家感兴趣可以看看。

码字不易,欢迎大家点赞,关注,评论,谢谢!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/18 23:19:24

Eclipse Ditto数字孪生平台实战入门:从零构建物联网虚拟设备模型

Eclipse Ditto数字孪生平台实战入门&#xff1a;从零构建物联网虚拟设备模型 【免费下载链接】ditto Eclipse Ditto™: Digital Twin framework of Eclipse IoT - main repository 项目地址: https://gitcode.com/gh_mirrors/ditto6/ditto 在物联网技术快速发展的今天&a…

作者头像 李华
网站建设 2026/10/17 18:33:11

使用PSpice分析三极管工作区域的超详细版教程

用PSpice“透视”三极管的内心世界&#xff1a;从截止到饱和&#xff0c;一图看懂工作状态你有没有遇到过这样的情况&#xff1f;电路搭好了&#xff0c;信号放大却不线性&#xff1b;开关明明该导通&#xff0c;却发热严重&#xff1b;示波器上看波形削顶&#xff0c;万用表测…

作者头像 李华
网站建设 2026/10/12 7:05:22

PyTorch-CUDA-v2.9镜像升级到最新PyTorch版本的风险提示

PyTorch-CUDA-v2.9 镜像升级风险与工程实践 在深度学习项目进入生产阶段后&#xff0c;一个看似简单的操作——“把 PyTorch 升级到最新版”——可能成为引发系统雪崩的导火索。我们见过太多团队因为一次未经验证的 pip install --upgrade torch&#xff0c;导致训练任务集体崩…

作者头像 李华
网站建设 2026/10/15 21:49:46

彩虹外链网盘终极指南:打造个人专属文件管理平台

彩虹外链网盘终极指南&#xff1a;打造个人专属文件管理平台 【免费下载链接】pan 彩虹外链网盘 项目地址: https://gitcode.com/gh_mirrors/pan/pan 彩虹外链网盘是一款基于PHP开发的全功能文件管理系统&#xff0c;能够帮助用户高效管理各类文件并生成外链分享。无论你…

作者头像 李华
网站建设 2026/10/13 10:44:38

终极Anki记忆卡片工具:从安装到精通完整指南 [特殊字符]

终极Anki记忆卡片工具&#xff1a;从安装到精通完整指南 &#x1f680; 【免费下载链接】anki Ankis shared backend and web components, and the Qt frontend 项目地址: https://gitcode.com/GitHub_Trending/an/anki 在信息过载的数字化时代&#xff0c;如何高效记忆…

作者头像 李华
网站建设 2026/10/18 2:18:22

Windows Auto Dark Mode:智能主题切换的技术实现与深度应用

Windows Auto Dark Mode&#xff1a;智能主题切换的技术实现与深度应用 【免费下载链接】Windows-Auto-Night-Mode 项目地址: https://gitcode.com/gh_mirrors/win/Windows-Auto-Night-Mode 你是否曾经在深夜工作时被刺眼的白色界面折磨得眼睛酸痛&#xff1f;是否厌倦…

作者头像 李华