从 C++98 到 C++26,经历了什么?
作为一名程序员,2023 年最应该关注的话题就是 C++的标准更新。
C++标准遵循 3 年开发周期,并以发布年份命名。C++在临发布的一年前会进入“功能冻结期(feature freeze)”,即版本开发进入半稳定状态,不再添加重大功能及特性,着重于修复各种 BUG。因此,直到 2025 年初,C++26 都会增加新内容。
上个月,C++26 时间表发布,将会在“并发和并行性方面有重大改进”。而已经推出的 C++ 23 版本则沿袭了 C++17 的传统特征,完善了现有特性。但是,与 C++ 98、C++11 或 C++20 相比,改变略小。
为理解 C++下一步的发展方向,我们将 C++放进历史大背景中讨论。
一、C++26 时间表发布改进并发和并行性
上个月,ISO C++委员会举行会议,正式通过 C++26 时间表。当时,共有近 180 名成员参会。ISO C++标准委员会主席兼微软本地语言架构师 Herb Sutter 发文详细介绍了有关 C++26 的最新进展。
C++ 26 首轮会议公告(图源:Herb Sutter)
Herb Sutter 在文章中表示:并发和并行小组目前仍在按计划推进 C++26 的 std::execution 和 SIMD 并行。该版本在“并发和并行性方面有重大改进”,但是,Herb Sutter 并没有透露具体改进内容与可能的技术细节。
值得一提的是,在本次会议上,委员会采纳首批共计 40 份变更文件,其中的变更都相当小。
C++ 26 时间表(图源:Herb Sutter)
据悉,与 C++ 26 相关的下两轮会议将分别于 11 月及次年 3 月举行,前者在美国夏威夷州科纳举行,由 WorldQuant 和 Standard C++ Foundation 主办;后者在日本东京举行,由 Woven by Toyota 主办。
二、C++23 标准
7 月,C++23 已完成更新,并进入了最终投票阶段。
C++23 是由国际标准化组织(ISO)和国际电信联盟(ITU)颁布的编程语言 C++标准。它最初于 2017 年 6 月正式发布,是 2001 年的 ISO/IEC 14882:2001(C++11)的下一个迭代。
C++23 完整地实现了 C++的表达力,并使其对计算机科学和软件工程更有用。
它的主要特性包括:模板参数捕获、可变参数模板等。同时,它还引入了一些新的核心语言特性,如,UTF-8 字符串字面量、更多的类型别名和 using 声明等。
此外,C++23 还引入了一些新特性,如,简化的工作线程支持、原子操作、普通指针改进、区域性和字符编码以及可以按程度进行编辑的新字符串操作。
最值得一提的是,C++23 中引入了 this 推导,使 C++轻松实现复杂技术。你可以直接使用 import std 导入标准库,或者在 std::print 和 std::println 中应用 C++20 的格式字符串。
此外,在 C++23 中,开发者将获得扁平化关联容器。这些容器平衡了时间和空间复杂度。std::flap_map 可取代 std::map,而 std::optional 的接口将扩展为单子接口。
三、从 C++98 到 C++20
那么,C++标准经历了哪些历史变革呢?
1.C++98
20 世纪 80 年代末,Bjarne Stroustrup 和 Margaret A. Ellis 撰写了著名的《注释 C++参考手册》(简称 ARM)。
当时,ARM 根据独立的 C++实现定义了 C++的功能;并且,ARM 为第一个 C++标准——C++98(ISO/IEC 14882)奠定了基础。
值得一提的是,C++98 包括:模板、包含容器和算法的标准模板库(STL)、字符串和 IO 流。
2.C++ 03
在 C++ 03(14882:2003)中,修正了一些微小的技术,但在社区中仍被称为传统 C++。
3.TR1
2005 年,令人兴奋的事发生了。Technical Report 1(简称 TR1)推出,是由 C++标准化委员会成员建立的 boost 项目,推动现代 C++向前迈出一大步,也为后续 C++11 的出现奠定了基础。
具体来讲,TR1 有 13 个库。这些库也成为了下个 C++版本的一部分,分别对应到正则表达式库、随机数库、智能指针(如,std::shared_ptr)和哈希表。
4.C++11
C++11 被称为现代 C++,它的许多特性从根本上改变了 C++的编程方式。例如,C++11 引入了 TR1 组件,还有移动语义、完美转发、可变模板或 constexpr 等特性。
但是,这些并不是全部。随着 C++11 的到来,我们还获得了内存模型作为基础的线程模型以及线程 API。
5.C++14
C++14 是一个小型 C++标准,引入了读写锁、泛化 lambda 和泛化 constexpr 函数。
实际上,C++14 相对之前的 11 并没有太大改动,或者说更像 C++11 标准基础上的查漏补缺。C++14 之后,还有 17、20、23,所以,C++14 更像个过渡版本。
6.C++17
C++ 17 有两个突出的特性:并行的 STL 和标准化的文件系统。大约 80 个 STL 算法可使用执行策略执行。
这意味着,调用 std::sort 可以在 C++中实现对容器 vec 并行排序的提示。此外,你还可以按顺序进行指定排序或向量化。
就像 C++11 一样,boost 对 C++17 也产生了重大的影响,从 boost 中获得了文件系统以及 3 种新的数据类型:std::optional、std::variant 和 std::any。
7.C++20
C++ 20 的革新从根本上改变了编写 C++的方式,程度不亚于 C++11,特别是以下四个重要特性:Ranges(范围库),Coroutines(协程),Concepts(概念)以及 Modules(模块)。
新的 Ranges 库能够直接在容器上表达算法、使用管道符组合算法,并将它们应用于无限数据流。
Coroutines 使异步编程在 C++中成为主流。Coroutines 是协作任务、事件循环、无限数据流或管道的基础。
Concepts 将改变我们对模板的思考和编程方式,是有效模板参数的语义类别。Concepts 让你能够直接在类型系统中表达你的意图。如果出了什么问题,你会收到简洁的错误信息。
Modules 将克服头文件的限制,也带来了诸多好处。例如,不再需要预处理器。最终,我们还将拥有更快的构建时间和更简单的包构建方式。
四、C++的下一步神奇递归模板模式
C++的设计模式大致可分为三类:创建型模式、结构型模式和行为型模式。
而神奇递归模板模式(CRTP)也是 C++的设计模式,精巧地结合了继承和模板编程技术,可用来为 C++的 class 提供额外的功能、实现静态、多态等。
总之,CRTP 实现了静态多态,将会成为接下来 C++的重要设计模式。
版权声明: 本文为 InfoQ 作者【树上有只程序猿】的原创文章。
原文链接:【http://xie.infoq.cn/article/1fe46d05af1926615797512bf】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论