熟悉我的朋友大概知道我最近翻译了一本介绍C++20特性的“小红书”《C++20高级编程》(第五版)C++标准委员会Marc Gregoire著这个版本满足了我对C++绝大多数的幻想。
通过Modules淘汰了C++之前编写大程序的陈旧方式;
使用Concepts帮助创建类型安全的模板和实现灵活的模板特化;
使用Ranges彻底改变了处理数据的方式。
这些新功能可以使C++比之前更简单、更优雅、更容易理解。
上图说明了C++20新增的内容,除了模块、概念、范围和协程四大模块之外,上图框出部分极大地反映了C++对并发的支持,C++20增加了很多在其他语言看起来应有的东西如:信号量,锁存器,屏障,可等待通知的原子类型,原子引用,线程安全的原子智能指针。
加上之前就有的各种并发支持:各种锁,线程,条件变量,异步,package_task,C++20对并发的支持可以说是最完善的了,远远超过其他语言,并且十分高效。
总结一下C++20在库特性和语言特性上的新变化:
在库特性方面
C++20使用std::format替代printf,丰富了I/O流,chrono增加了对日历和时区的支持,增加std::atomic<std::shared_ptr>std::atomic<float>等,使用std::source_lacation替代_LINE_、_func_宏,使用std::span表示一个片段。
C++20中的std::endian可获取当前平台是大端序还是小端序,std::make_shared支持构造数组,std::remove_cvref移除cv和ref,std::to_address可获取地址,std::assume_aligned可指定内存对齐。C++20中可以使用midpoint计算中位数、lerp计算线性差值,std::is_bounded_array检查数组是不是有界,并添加了Ranges库以用来处理元素范围和的组件。
此外,C++20中增加了barrier屏障、latch、counting_semaphore信号量、std::jthread、bind_front、std::size:signedsize、std::basic_osynacstream和string系列操作string::starts_with、ends_with等。
最后,添加了e、log2e、log10e、pi、inv_pi、inv_sqrtpi、ln2、ln10、sqrt2、sqrt3、inv_sqrt3、egamma、phi等数字常量。
在语言特性方面
C++20添加了比较运算符号<==>,for loop内初始化变量、[[no_unique_address]]、[[likely]]、[[unlikely]]、consteval、constint。C++20中,可使用lambda表达式捕获this方式,lambda表达式可以使用模板,某些时候不需要使用typename,结构体可以直接初始化。C++20支持协程、支持modules、可以using enum、引用约束和概念,且函数模板可以缩写。
其中,最重要的四大概念分别是概念(concept)、范围 (ranges)、协程(coroutines)和模块(module)。
使用模板
进行通用编程的关键思想是定义能通过各种类型(type)使用的函数和类,但是在实例化模板时经常会出现用错类型的问题,其结果通常是几页难懂的报错信息。概念将改变这个问题,让编程者为模板编写要求,而编译器则可以检查这个要求。概念革新了思考和编写通用代码的方式,因为模板的要求是接口的一部分,类模板中的函数重载和特殊化可以基于概念进行,且编译器能够比较模板参数的要求与实际的模板参数,所以能得到更好的报错信息。
使用概念,编程者可以使用预定义的概念,也可以定义自己的概念。C++20将auto和概念的用法统一到了一起,可以不使用auto,而是使用概念。如果一个函数声明使用了一个概念,那么它会自动变成一个函数模板,由此,编写函数模板就变得与编写函数一样简单。
范围库
使其能够在容器上直接表达算法,通过管道符号组合算法,并将其用于数据流中。范围是概念的首个客户,它支持的算法满足以下条件:可以直接在容器上操作,无需迭代器指定范围;可以宽松地评估;可以组合。简单来说,范围支持函数模式。
协程
是广义的函数,能在保持状态的同时暂停或继续。协程让C++异步编程能力更加强大,甚至可能成为主流,是多任务合作、事件循环、管道的基础。协程通常用来编写事件驱动型应用。事件驱动型应用可以是模拟、游戏、服务器、用户接口或算法。协程通常也被用于协作式多任务。
模块
引进了import官架子,让C++在#include的基础上支持更现代化的模块设计,减轻传统头文件带来的一些问题,提升编译的速度,并带来更简单的构建包的方式。模块能够实现更快的编译时间、宏的隔离、表达代码的逻辑结构、不必再使用头文件,且能够摆脱丑陋的宏方法。
总之,C++20作为一个重大版本发布,又给C++带来了更多新的可能。
作为译者,就算有王婆卖瓜之嫌和亲妈滤镜之感,但以一个C++程序员的视角看《C++20高级编程》还是颇有可取之处。
作者比利时C++用户组的创始人、C++标准委员会委员Marc Gregoire以丰富的编程经验,在全新的角度对C++进行了介绍。第一部分是C++基础速成教程,介绍了简洁的语法、字符串以及清晰易懂的编码风格,第二部分介绍C++设计方法论,讨论软件设计、面向对象设计、可重用代码设计,第三部分从专业角度分析C++编程技术,第四部分讲解如何真正掌握C++的高级功能,第五部分重点介绍C++软件工程技术。并且附录中还赠了求职问题合集,提供了关于C++的各种知识点需要记住的内容,以及求职者可能面对的各种不同类型的问题。
这个系列还有个兄弟本《C++20实践入门》,也叫新手本,套装如下,现在活动直降193,直接5折带走,更划算!
老规矩,评论区挑5个老铁送书!
截止时间:2022年9月27日(周二)晚八点