c++入门后如何进阶

嵌入式技术

1351人已加入

描述

作者 | Rainer Grimm 译者 | 明明如月

C++23 将会是 C++20 后的下一个 C++ 标准。这个新标准对 C++ 进行了大幅改进,但其影响力却不如 C++98、C++11 或 C++20 那样翻天覆地。C++23 更像是 C++17 的传统延续。

 

C++


 

为了理解 C++ 的这一进化步骤,让我们将 C++ 标准放在历史背景中来看看。

C++ 标准
    C++ 已有超过 40 年的历史了。那么,在这些年里,C++ 都经历了什么变化呢?以下是一个简要的回答,一直延续到 C++23。
  C++98
  在 20 世纪 80 年代末,Bjarne Stroustrup 和 Margaret A. Ellis 合著了他们的著名书籍 Annotated C++ Reference Manual(注释版 C++ 参考手册,简称 ARM)。这些书有两个目的。首先,那时存在许多独立的 C++ 实现。因此,ARM 定义了 C++ 的功能。其次,ARM 是第一个 C++ 标准 C++98(ISO/IEC 14882)的基础。C++98 有几个关键特性:模板、包含容器和算法的标准模板库(STL)、字符串和 IO 流。
  C++03
  随着 C++03(14882:2003),C++98 得到了一项微小的技术修正,小到在我的时间线上都没有容身之地。在社区中,包括 C++98 在内的 C++03 被称为传统的 C++。
  TR1
  2005 年,发生了一件令人非常兴奋的事情。这一年,发布了所谓的技术报告 1(Technical Report 1,简称 TR1)。TR1 是向着 C++11,因此向着现代 C++ 的一大步。TR1(TR 19768)是基于 C++ 标准化委员会成员创立的 boost 项目。TR1 有 13 个库,这些库也成为下一个 C++ 标准的一部分。例如,库对应到正则表达式库、随机数库、智能指针如 std::shared_ptr,以及哈希表。只有所谓的特殊数学函数需要等到 C++17 才能使用。
  C++11
  C++11 是下一个 C++ 标准,但我们通常称之为现代 C++。现代 C++ 也包括了 C++14 和 C++17。C++11 拥有许多特性,这些特性从根本上改变了我们编写 C++ 程序的方式。例如,C++11 引入了 TR1 的组件,还有移动语义、完美转发、变长模板或 `constexpr,还有其他诸多特性。随着 C++11 的到来,我们还得到了一个内存模型作为基础的线程模型,以及一个线程 API。如果你感到好奇,这里有我关于内存模型和多线程的一些基本文章。
  C++14
  C++14 是一个小型的 C++ 标准。它引入了读写锁、泛化的 lambdas 和泛化的 constexpr 函数。
  C++17
  C++17 有两个显著的特性:并行 STL 和标准化的文件系统。大约 80 个 STL 算法可以使用所谓的执行策略进行执行。这意味着 std::par, vec.begin(), vec.end()) 对 C++ 实现的排序容器 vec 是一个并行处理的提示。此外,你还可以指定排序应按顺序执行(std::seq)或向量化执行(std::par_unseq)。就像 C++11 一样,boost 对 C++17 也产生了深远影响。我们从 boost 获取了文件系统以及三种新的数据类型:std::optional、std::variant 和 std::any。这里是我关于 C++17 (链接见文底)的一些文章。
  C++20
  C++20 的变革对我们编写 C++ 程序的方式产生了根本性的影响,其程度不亚于 C++11。特别是以下四个重要特性:Ranges(范围库),Coroutines(协程),Concepts(概念),以及 Modules(模块)。
  新的 Ranges 库让我们可以直接在容器上表达算法,使用管道符组合算法,并将它们应用于无限数据流。
  多亏了 Coroutines,异步编程在 C++ 中可能会成为主流。协程是协作任务、事件循环、无限数据流或管道的基础。
  Concepts 将改变我们对模板的思考和编程方式。它们是有效模板参数的语义类别。它们让你能够直接在类型系统中表达你的意图。如果出了什么问题,你会收到简洁的错误信息。
  Modules 将克服头文件的限制。它们带来了很多好处。例如,预处理器将变得不再需要。最终,我们还将拥有更快的构建时间,更简单的包构建方式。
  关于 Ranges、Coroutines、Concepts、Modules 和 C++20 的文章可以参见链接。
  C++23
  现在(2023年7月),C++23 已经完成,并进入了最终投票阶段。
  C++23 提供了一种小巧但影响深远的核心语言特性——this 的推导。这种特性允许你,类似于 Python,在成员函数定义中明确地传递隐式传递的 this 指针。引入 this 的推导后,一些 C++ 中复杂的技术,例如 CRTP (奇异递归模板模式) 或者 Overload Pattern(过载模式),将变得轻而易举。
  C++23 库还将新增很多有意思的特性。你可以直接使用 import std; 导入标准库,或者在 std::print 和 std::println 中应用 C++20 的格式字符串。此外,我们将出于性能考虑,获得如 std::flat_map 这样的扁平化关联容器,这些容器在时间和空间复杂度上做了一个平衡。std::flap_map 可取代 std::map 。std::optional 的接口将扩展为具有组合性的单子接口。新的数据类型 std::expected 已经具有可组合的接口,可以用于错误处理,存储预期值或非预期值。多亏了 std::mdspan,我们可以创建和操作多维数组。最后,std::generator 是第一个用于创建数字流的具体的协程。std::generator 是 Ranges 库的一部分,该库也将在 C++23 中得到增强。
    网友:比 Python 差远了
    很多网友对 C++23 的改进展开了广泛讨论,
  很多网友对此次更新并没有感到那么兴奋。有网友表示很高兴看到 C++23 将带来 C++ 可用性的提升,但和 Python 还差很远。有网友对此甚至表示失望,他认为 C++23 和 C++ 98 相比,并没什么革命性的特性,居然还有人会为此感到兴奋。
  有的网友则愿意给 C++23 一个机会。他很久以来一直用 C++,但是他对 C++ 的复杂性感到不满,所以他主要用 C++11。他说现在 C++ 有了模块、概念等新特性,他开始考虑 C++23 是否值得用于新项目。他原本想用 Rust 代替 C++,但是现在他可能会给 C++23 一个机会。有网友认为 C++ 的复杂性是因为它承诺永远能够兼容旧的代码造成的。
  还很多网友在评论区对各种编程语言进行了讨论。有网友认为,问题并不是出在语言本身,而取决于你用它来实现什么样的功能。例如,如果你想使用虚幻引擎或编写音频插件,就学习 C++。如果你想玩机器学习,就学好Python。如果你想制作移动应用程序,就学习 Swift 或 Kotlin。
  编辑:黄飞

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分