下个版本已定!C++自救新动作!

原创 精选
开发 前端
诚然,许多新语言都踩在旧语言的肩膀上,而且是从旧语言犯过的错误中汲取养料,茁壮起来。Rust从C++中学到了内存安全的重要性,Zig从C中选择了更细分的内存分配,Go则带上“指针”和“垃圾收集”两件法宝自成一派。

撰稿丨云昭、千山

自去年年底,美国安全局(NSA)在其所发布的《Software Memory Safety》报告中点名批评C++之后,C++之父Bjarne Stroustrup一顿回怼后,做出决定:内部自救。现在,就让我们看看下一个版本的C++,究竟有哪些大动作!

1、三年一版本,26版时间表已定

ISO C++标准委员会主席、微软原生语言架构师Herb Sutter,6月16日发布了关于C++26的进展,承诺“将发布一个巨大的并发和并行版本”以及其他变化。

C++版本按发布年份命名,并遵循3年一个版本周期。该委员会在保加利亚瓦尔纳举行了在线会议,有近180名成员,并正式通过了C++26的时间表。

图片

萨特表示,该时间表“与C++23的时间表相同,只是各个节点处向后加了三年”。时间表显示,“以前从未见过”的新语言功能的最后日期是2024年第三季度,功能冻结的节点是在2025年第一季度。(PS:C++23的功能冻结是在2022年第一季度。)

值得注意的是:功能冻结并不意味着2026年停止开发新版本,而是暂停将新功能加载到这个特定序列中的检查点。一般而言,第三年是一些繁琐的错误修复的一年。

2、核心变更一览

萨特说,委员会通过了40份“变更文件”。这其中,有两份是“为所有就绪问题”提出的应用解决方案,其余38份都是单独的更改(如错误修复、新功能等)。

目前为止提出的新功能大都比较低调。比如:添加了对_字符作为通配符的支持,并将@、$和`添加到基本字符集(就像对C23所做的那样)。

举个例子:编译器开始支持draft-C++26语法:

std::lock_guard_(mutex);
auto [x,y,_]=f();
inspect(foo){_=>bar;};

标准库更改

  • 添加了“function_ref”类型可擦除的可调用引用
  • 添加“格式化指针”允许对指针值进行漂亮的格式化,而无需reinterpret_cast首先转换为整数类型。例如,现在可以这样用:format("{:P}", ptr)
  • 添加“constexpr”允许编译时使用标准库的稳定排序等。

“格式化指针”允许对指针值进行漂亮的格式化,而无需reinterpret_cast首先转换为整数类型。例如,这现在可以工作了:format("{:P}", ptr);

图片

3、Hazard Pointer:C++26新增“危险指针”

危险指针是“只有危险指针的所有者才能设置其值,而任何数量的线程都可以读取其值”的指针。

危险指针是一个单写多读指针,在任何时候最多可由一个线程拥有。只有危险指针的所有者可以设置其值,而任何数量的线程都可以读取其值。所有者线程将危险指针的值设置为指向某个对象,以便向可能删除该对象的并发线程指示该对象尚未安全删除。

不过,这对C++安全来说都不是一场革命。Hacker News的一位开发人员表示:“如果你正在编写无锁并发数据结构,并且你需要一种方法来处理节点删除后的延迟回收,那么危险指针很重要。这是一个非常奇怪的问题,很难成为‘内存安全问题的常见来源’。

另一位开发者进行了补充:“在迭代器中使用,这是危险指针的用例之一。危险指针可以在不令已有迭代器失效的情况下改变hashmap的key,虽然它适用于多线程,但如果写入和读取恰好在统一线程上,一样有效。”

Sutter表示,“并发和并行子组仍在推进C++26的std::execution和SIMD并行”,这将是并发编程的重要功能。

4、后来者带来的压力

相较于Sutter对于C++标准的稳步发展的热情,编程领域内对于新语言的呼声却越来越高。前不久,微软首席技术官Mark Russinovich宣布,“是时候停止用C/C++启动任何新项目,并在需要非GC语言的情况下使用Rust了。为了安全和可靠性,行业应该宣布这些语言不受欢迎。”

除了Rust,C++的另一个潜在竞争对手是谷歌的实验性项目:Carbon;甚至就连Sutter自己,也提出了实验性的cppfront,他说:“我的目标是探索是否有一种方法,可以使C++变得更简单、更安全、更可工具化10倍!”cppfrond语言由Sutter于2022年底在CppCon上提出。

然而,新语言的一个问题是大量的现有代码永远不会被移植,这意味着改进C++仍然是值得的,即使对于那些认为它有固有缺陷或过于复杂的人来说也是如此。

5、越来越不像C++了

对于一门上世纪诞生的骨灰级编程语言来说,C++可谓非常成功。然而,许多C++爱好者中,流行一种说法:C++11以后,C++也越来越不像C++了。它完全是一门新的语言。

C++活生生把自己变成了一个筐,缺啥东西都得装。网友抱怨:明明是一个聚焦底层的语言,为什么很多人幻想在标准库里放各种迎合千奇百怪需求的上层库呢?

与其这样,还不如多关注C++本身底层的改进,好好维护发展库生态。

图片

截图:知乎

此外,C++社区分裂,缺少统一标准,也是其近些年一直被诟病的地方。Windows阵营、谷歌阵营、QT阵营彼此割裂导致移植性不会像Java、Go那样子丝滑。

图片

截图:知乎

6、写在最后

诚然,许多新语言都踩在旧语言的肩膀上,而且是从旧语言犯过的错误中汲取养料,茁壮起来。Rust从C++中学到了内存安全的重要性,Zig从C中选择了更细分的内存分配,Go则带上“指针”和“垃圾收集”两件法宝自成一派。

而C++曾经也是一位昂扬向上的少年,只不过经历了40年之久的他,已经无须证明自己有多么成功。现在C++很清醒:它已经是一个老语种,身上的包袱很重,更需要稳定地负责任地承载着过去的版本,同时一路吸收着后来的其他语言“小弟”们创新点,慢慢前行。

参考链接:https://devclass.com/2023/06/19/c-26-is-already-taking-shape-says-herb-sutter/

责任编辑:武晓燕 来源: 51CTO技术栈
相关推荐

2023-10-31 17:57:52

C++编程语言

2009-12-10 08:57:44

Linux新版驱动

2023-02-08 07:05:44

2017-10-25 16:04:35

2021-10-14 15:03:47

网络安全谷歌攻击

2023-09-21 18:16:57

Linux内核系统

2023-10-14 12:05:59

KubuntuLinux

2013-12-25 10:24:42

微信认证收费微信店铺系统

2019-07-23 09:12:08

2013-12-27 11:02:07

微信认证收费

2011-01-19 11:34:52

Ubuntu中国版本Ubuntu

2021-06-04 14:25:29

鸿蒙HarmonyOS应用

2022-06-13 15:49:38

LinuxLinux 5.19

2021-11-15 12:14:49

零信任网络安全网络攻击

2021-11-16 22:56:05

Windows 11Windows微软

2020-03-31 18:50:33

微软Windows操作系统

2017-01-13 14:22:23

Windows 10绿屏BSOD

2018-05-22 10:34:06

ChromeHTTPS自动播放

2018-09-21 10:00:18

5G运营商通信网络
点赞
收藏

51CTO技术栈公众号