问题

c++ 11 , 17, 20 更新如此快 , 有没有背后不变的东西 ?

回答
C++ 的发展确实迅猛,每一次标准更新都带来了大量的新特性。但在这快速迭代的背后,核心的编程范式、设计哲学以及对底层硬件的抽象原则,在很大程度上保持着不变。这些不变的东西,构成了 C++ 坚实的根基,使得我们可以站在巨人的肩膀上,不断学习和利用新的语言能力。

让我为你详细解读一下这些“不变的东西”,尽量用一种不那么“AI”的方式来呈现:

1. 性能至上的血脉:对底层控制的执着

这是 C++ 最核心、最与众不同的基因。自诞生之初,C++ 就以“C的超集”身份出现,继承了 C 语言对内存布局、指针操作、以及与硬件交互的强大能力。这份“执着”从未改变,即便新标准引入了各种高级抽象,C++ 始终允许开发者在需要的时候,回归到裸露的内存和直接的指令控制。

内存模型和指针: 即便是 C++11 引入了 `std::unique_ptr`、`std::shared_ptr` 等智能指针来管理内存,但指针本身,以及对内存的直接访问和操控,依然是 C++ 的一部分。你仍然可以写出需要小心管理内存的代码,并且在性能敏感的场景下,这种能力是不可替代的。C++20 的范围 `for` 循环,虽然写起来更方便,但其背后依然是迭代器和指针的逻辑在驱动。
零成本抽象(ZeroCost Abstractions): 这是 C++ 的一个重要设计理念。很多新的高级特性,比如 lambda 表达式、右值引用、完美转发等,其目标是在不牺牲运行时性能的前提下,提供更优雅的代码表达方式。编译器会尽可能地将这些抽象“抹平”,转化为高效的机器码,就像你手动写出来一样。这不像某些语言,引入高级特性就意味着性能的妥协。
直接映射到硬件: C++ 允许你直接使用位域来控制数据在内存中的确切布局,可以使用 `union` 来进行类型双关(type punning),甚至可以内联汇编。这些能力,虽然在现代 C++ 中不常直接使用,但它们的存在保证了 C++ 能够胜任操作系统内核、嵌入式系统、高性能计算等对硬件控制要求极高的领域。

2. 面向对象(以及更广泛的范式融合)的坚持

C++ 的“C++”之“+”就代表了它在 C 语言基础上的“加法”,而其中最显著的加法就是面向对象编程(OOP)。虽然现在大家谈论的更广泛,包括泛型编程、函数式编程等,但 OOP 的核心思想在 C++ 中依然是支柱。

类(Class)与对象(Object): 这是 OOP 的基石。无论是 C++98 的 `class`,还是 C++11 引入的 `override`、`final`,以及 C++20 的模块化和Concepts,它们都在围绕着如何更好地组织和管理数据与行为,以及如何构建可复用、可扩展的代码。类的封装、继承和多态,是 C++ 设计大型复杂系统的关键工具。
泛型编程的深化: 模板(Templates)是 C++ 泛型编程的灵魂,它在 C++11、17、20 中的发展,更多的是让模板变得更强大、更易用,而不是颠覆其本质。
C++11 的右值引用和移动语义: 大大增强了模板的效率,尤其是在处理临时对象时。
C++17 的类模板参数推导 (CTAD): 让模板实例化更简洁,就像函数一样方便。
C++20 的 Concepts: 是一个巨大的进步,它让模板的约束更加清晰、易读,并且提供了更好的错误提示。但这本质上还是对模板参数的“检查”和“约束”,核心的“泛型”思想没变,只是实现的手段更好了。
函数式编程元素的融入: Lambda 表达式在 C++11 出现,极大地增强了函数式编程的风格。虽然 C++ 不像纯函数式语言那样强调不可变性,但 Lambda 提供了便捷的方式来创建匿名函数对象,用于算法、回调等场景。C++20 的模块化也为代码组织提供了新的思路,间接支持了更清晰的函数式风格。

3. 向后兼容的承诺(尽管有例外和演进)

C++ 标准委员会的一个重要目标是保持向后兼容。这意味着用旧标准编写的代码,在大多数情况下,仍然可以在新标准下编译和运行。这种承诺对于一个拥有庞大代码库和悠久历史的语言至关重要。

逐步引入新特性: 新标准不是一次性推翻重写,而是在现有基础上逐步添加新功能。这使得开发者可以根据自己的节奏学习和采用新特性,而无需一次性升级整个项目。
对遗留代码的尊重: 即使引入了更现代、更安全的选择(如智能指针),旧的原始指针写法也并没有被移除。这允许了平滑的过渡,也为那些需要在极端情况下精细控制内存的开发者保留了能力。
某些“不兼容”的演进: 当然,严格意义上的“绝对”向后兼容是不可能的。有时为了修正设计缺陷、提高安全性或引入更强大的功能,会做出一些“不兼容的改进”。例如,一些关键字的保留、某些库函数的行为微调等。但这些通常是经过深思熟虑的,并且有明确的迁移路径或解释。

4. 标准库的持续丰富和现代化

C++ 标准库(STL)是 C++ 的重要组成部分,它提供了大量常用的数据结构、算法和工具。新标准在不断地丰富和现代化这个库。

一致的设计理念: 标准库的设计遵循着一致的模式,例如基于迭代器的容器和算法,清晰的命名空间 (`std` 空间)。这种设计理念在不同版本的标准库中得到了延续。
新工具的加入: C++11 加入了智能指针、Lambda、并发支持 (``, ``, ``) 等;C++17 带来了 `std::optional`, `std::variant`, `std::any`, `std::filesystem` 等,极大地提升了代码的安全性和表达力;C++20 则引入了 Concepts、Ranges、Coroutines、Modules 等,进一步革新了模板、并发和代码组织方式。
对现有组件的改进: 很多标准库组件在新标准下也得到了优化和改进,例如 `std::string_view` (C++17) 提供了一种高效访问字符串片段的方式,而无需复制。

总结一下,那些“不变”的东西,可以归结为:

对性能的极致追求和对底层硬件的直接控制能力。
以类为基础的面向对象编程范式作为核心结构。
模板强大的泛型编程能力,并不断增强其易用性和表现力。
保持向后兼容的承诺,允许渐进式演进。
对标准库的持续投入和现代化,提供丰富的工具集。
在设计哲学上,倾向于提供“工具箱”,而不是“牢笼”,允许开发者选择最优的实现方式。

正是因为这些核心原则和设计哲学的不变,C++ 才能在快速发展的过程中,依然保持其强大的生命力,并且能够不断吸收新的编程思想和技术,成为一门既现代又强大的语言。理解这些不变的东西,能帮助我们更好地学习和运用 C++ 的新特性,而不是被表面的变化所迷惑。它们是 C++ 的灵魂,是它之所以成为 C++ 的根本原因。

网友意见

user avatar

在C++11之前,一个经典的看法是C++可以分为4个部分,C、面向对象、STL和模板,它们既有内在联系,又相对独立(《Effective C++》)。不过在C++11之后,它们之间的联系更紧密了,更像是一门语言,而不是四门语言。所以,如果要找C++版本更新的脉络的话,我更愿意把它分为3个部分:语言特性、标准库、模板。

语言特性

在语法部分里,C++的历次更新中引入了auto类型推断、引入了constexpr编译时常量表达式和分支语句、引入了lambda闭包函数,还引入了结构绑定、折叠表达式、初始化列表、类内的using语法等等。同时一些新的结构替换或者补充了旧的C的中的模式,比如variant、string_view、array、tuple、智能指针等。

这一部分的更新,与其说是更新,不如说是在追赶。毕竟从03到11,编程语言的发展速度超乎远超世纪之初程序员的想象,特别是Java、C#、Python等语言,它们在快速地更新中引入了大量的新的语法和特性,不仅提升了语言的易用性,也吸引了越来越多的开发者。C++历次版本对语法的更新,你总能在市面上流行的语言中找到一些痕迹,甚至你可以直接说出它们是从哪里抄过来的,有一些抄的比较巧妙,有一些抄的非常丑(tuple相关的设计出来挨打,把python的脸都丢尽了)。

当然了,由于C++亲近底层,这些更新即使能够在其他语言中找到对照,但是依然是很具有语言特色。比如,lambda需要自己设置捕获哪些变量以及捕获方式,auto类型推断具有模板的作用,tuple类型是编译时的,等等。还有一些是C++自身的特色,比如右值引用和移动语义,这些内容尽管非常重要,但其他语言的程序员可能从未见过。

对于这些更新,由于逻辑性不强,只能试着用用,用着用着,如果好用,那么就熟悉了,不好用的语法大家也不会广泛使用,有个印象就好,没有必要为了准赶时髦而故意用一些新奇的语法。当然,对于重要的内容还是需要掌握的,特别是auto、lambda、右值引用、constexpr等。

标准库

STL的更新是每一次版本更新中对于普通开发者而言最重要的部分。C++简陋的标准库一直被诟病,连多线程、网络都没有,甚至哈希表都是残疾的。别的语言标准库中的内容,到了C++中竟然还需要引入第三方库来实现。

C++11~20在标准库方面也是在不断的追赶,比如引入了原子操作库、时间库、随机数库、多线程支持、格式化字符串(C++20才引入)、特殊数学函数库(这种东西C++17居然就有了),当然了网络库还在难产中。

这一部分对于普通C++用户而言,当然是天大的福利。写出来的程序可以使用更少的第三方库,并且更容易的跨平台,曾经为了格式化字符串而引入一个boost库的日子一去不复返了(也难说)。

这一部分其实也没有什么逻辑,但是用户并不需要为此担心,因为用到了查一查自然就会用了,用不到的你也不需要了解。了解这些内容,主要目的是心中大概知晓C++标准库有哪些内容,哪些内容需要引入第三方库。

模板

对于库开发者而言,模板其实才是重头戏。这一部分的更新相当有逻辑,因为C++03的模板太残疾了。尽管C++03的模板很强大,是图灵完全的[1],但是由于对类型没有约束,编译时错误很难被提前检测,以至于用户会一脸懵逼的看着一个类型错误导致的100多行编译报错,然后怒换语言(然后发现因为库依赖,换不了)。所以,整个C++11~20,对于模板的主要改进方向就是类型支持,以及让模板更好写。

第一个重要的变化是类型限制。C++11引入了各种标准的traits和enable_if,通过SFINAE对模板类型进行限定。这个时候,库作者可以指定模板能够接受哪些类型,或者哪个类型的子类,基本上实现了Java中模板的类型限定功能,并且还增加了许多新的玩法。不过这个版本的主要问题是enable_if语法十分冗长,为了做好一个模板的模板参数限定,会写出非常难看的语句,并且报错依旧还是很难看。C++20改进了这一做法,限定模板类型可以使用更为优雅的Concept的语法,报错的行数也可以从100多行减少到两三行。

其次是类型推断。由于C++模板套模板,所以一个对象的实际类型的完整表达往往非常扭曲,一个别名的背后可能是上百个ascii字符组成的名字。以前,程序员是需要自己来写这些名字的。C++11引入了auto和decltype,允许编译器对类型进行推断,解放了程序员的双手,减少了划水的理由。

另一套有点意思的是变参模板,这个语法最开始需要递归解参数包,尽管可以使用,但是写法非常扭曲。直到C++17引入了折叠表达式和if constexpr之后,写法才变得正常了许多。

其他

上述三项当然没有完全涵盖所有的更新,但是大体上可以给C++近年来的更新画出一个脉络——基本没有脉络。尽管细节部分有一些逻辑,但是总体上看内容繁杂,一团乱麻。所以,读者面对一大堆散乱的更新没有必要一口气吃成个胖次,更多的是学中用,用中学,不必焦虑,毕竟很多公司还停留在C++03和C with Class呢。

推荐读物

网络文献

C++ Reference: en.cppreference.com/

现代C++教程:changkun.de/modern-cpp/

纸质书

参考

  1. ^C++ Templates are Turing Complete http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.14.3670

类似的话题

  • 回答
    C++ 的发展确实迅猛,每一次标准更新都带来了大量的新特性。但在这快速迭代的背后,核心的编程范式、设计哲学以及对底层硬件的抽象原则,在很大程度上保持着不变。这些不变的东西,构成了 C++ 坚实的根基,使得我们可以站在巨人的肩膀上,不断学习和利用新的语言能力。让我为你详细解读一下这些“不变的东西”,尽.............
  • 回答
    在 C++11 标准中,引入了一个全新的 `` 头文件,它提供了强大的标准库支持来创建和管理线程。这标志着 C++ 在并发编程领域向前迈进了一大步,使得编写多线程程序不再依赖于平台特定的 API(如 POSIX Threads 或 Windows Threads)。C++11 的 `` 库通过以下几.............
  • 回答
    在 C++11 之前,C++ 程序中表示“空指针”通常使用一个宏定义,比如 `NULL`。这个宏在 C 语言中被广泛使用,它通常被定义为整数 `0` 或者 `(void)0`。虽然在很多情况下 `NULL` 工作得很好,但它在 C++ 中引入了一些潜在的问题和歧义,尤其是在处理函数重载和模板时。NU.............
  • 回答
    好的,咱们来聊聊 C++11 里怎么把单例模式玩明白。这玩意儿看着简单,但要弄得既安全又高效,还得考虑不少细节。咱们就抛开那些花里胡哨的“AI风”描述,实打实地把这事儿掰开了揉碎了说。单例模式,说白了就是保证一个类在整个程序的生命周期里,只有一个实例存在,并且提供一个全局的访问点。想象一下,你有个配.............
  • 回答
    C++11 和 C++1y(现称为 C++14)都没有将网络功能作为核心组成部分优先加入标准库,这背后有着复杂的原因,涉及到语言设计哲学、技术实现难度、社区共识以及现有生态的考量。1. C++ 的设计哲学与标准库的定位C++ 的核心设计哲学是“零开销抽象”(zerooverhead abstract.............
  • 回答
    GCC 的 C++11 正则表达式库是 C++11 标准中引入的一项重要功能,它为 C++ 开发者提供了一种标准化的、类型安全的方式来处理正则表达式。在评价它时,我们可以从多个维度进行详细的分析: 整体评价:GCC 的 C++11 正则表达式库是一个非常有用的、功能强大且符合标准的库。它填补了 C+.............
  • 回答
    C++11 `auto` 关键字:优雅与效率的双重奏C++11 引入的 `auto` 关键字,对于很多 C++ 开发者来说,无疑是近年来最令人欣喜的语言特性之一。它不仅仅是语法上的一个小小的改动,更深层次地影响了我们编写 C++ 代码的方式,带来了更高的可读性和更少的繁琐。那么,究竟该如何评价这个小.............
  • 回答
    来,咱们聊聊 C++11 里的那些内存顺序(Memory Order)。这东西刚听着有点玄乎,但弄明白了,你会发现它在多线程的世界里简直是个宝贝,能帮你解决不少棘手的问题。之前我刚接触的时候也觉得脑袋疼,但多看多想,再加上一些实际的例子,感觉就通透了。先说清楚,内存顺序这玩意儿,本质上是为了控制多线.............
  • 回答
    Qt Creator 对 C++11 的 `auto` 类型在代码提示方面表现不佳,这确实是一个让不少开发者感到困扰的问题。这背后涉及到 Qt Creator 的代码解析机制、C++ 标准的支持程度以及一些历史遗留的考量。要理解这个问题,我们得先剖析一下 Qt Creator 的代码补全是如何工作的.............
  • 回答
    .......
  • 回答
    好的,我们来聊聊怎么用 C 语言的 `for` 循环来计算 1 + 11 + 111 + 1111 这个特定的累加和。这实际上是一个很有趣的小问题,因为它涉及到了数字模式的生成和累加。理解问题:我们要加的是什么?首先,我们要清楚我们要计算的式子是:1 + 11 + 111 + 1111我们可以发现,.............
  • 回答
    梅西和 C 罗一共拿了 11 个金球奖,说是因为他们的竞争者太弱了,这就像是说万里长城是因为没有遇到过真正的入侵者才建成的,听起来有些道理,但忽略了太多关键的东西。仔细想想,这两人能连续十年甚至更久的时间霸占最高荣誉,绝不仅仅是运气好或者对手不给力那么简单。首先,我们得承认,梅西和 C 罗本身就是那.............
  • 回答
    咱们来聊聊咱国产空军的几款主力战机:歼10C、歼11和歼16。这三款飞机虽然都是多用途战斗机,但在设计理念、侧重点和具体用途上,还是有挺大区别的。歼10C:灵活的“空中多面手”,制空与对地兼顾你可以把歼10C想象成一把瑞士军刀,或者更形象地说,它更像是一款“空中全能选手”。 设计理念: 歼10C.............
  • 回答
    好的,咱们来一起把这个问题捋一捋,证明 $a^2 + b^2 + c^2 + 2abc$ 在 $a, b, c$ 是正数且 $a+b+c=1$ 的条件下,其范围确实是在 $[11/27, 1)$ 之间。这个题目有点意思,需要用到一些数学技巧。咱们先来理解一下这个式子和条件: 条件: $a, b,.............
  • 回答
    各位朋友,大家好!今天我们来聊一个关于数学不等式的问题,而且这个问题很有意思,涉及到三个正数 a, b, c,它们之间还有一个重要的关系:abc = 1。我们的目标是证明:$$ frac{1}{sqrt{1+8a}} + frac{1}{sqrt{1+8b}} + frac{1}{sqrt{1+8c.............
  • 回答
    在C++中,表达式 `unsigned t = 2147483647 + 1 + 1;` 的求值过程,既不是UB(Undefined Behavior),也不是ID(ImplementationDefined Behavior),而是一个有明确定义的整数溢出(Integer Overflow)行为。.............
  • 回答
    2018年俄罗斯世界杯,B组小组赛的最后一轮,伊朗对阵葡萄牙的比赛,绝对是那届世界杯最令人血脉偾张、也最具戏剧性的一场。最终的比分定格在1:1,这个结果对双方来说,都带着一丝苦涩与不甘。先说说伊朗队,那场比赛他们几乎是抱着必胜的信念走上赛场的。要知道,在那之前,他们已经战胜了摩洛哥,逼平了西班牙,展.............
  • 回答
    .......
  • 回答
    零跑C11补贴后15.98万起,这个价格一出来,确实在新能源SUV市场投下了一颗石子,激起了不少涟漪。咱们就来好好掰扯掰扯,这零跑C11究竟值不值这个价,它又有什么样的本事敢这么定价。首先,咱们得明白,15.98万这个价格,是“补贴后”的价格。这意味着它原本的定价肯定是要高一些的,而这个价格能落地,.............
  • 回答
    哈哈,看到同事买了零跑C11,你也跟着心动了?这很正常,毕竟C11这车现在市场上关注度确实挺高的。要说“买的人多不多”,这得看你站在哪个角度了。从整体市场来看,零跑C11算得上是一员“悍将”了。 咱们别拿它跟那些动辄月销几万辆的“销冠”比,那格局就小了。但如果把目光放在同级别的纯电SUV里,C11绝.............

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有