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

news2025/1/10 20:42:19

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

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

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

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

 

 

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

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

核心变更一览

萨特说,委员会通过了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);

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

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

 

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

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

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

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

后来者带来的压力

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

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

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

越来越不像C++了

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

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

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

 

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

 

写在最后

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

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


学习交流关注公众号:奇牛编程

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/717263.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Go】Go 语言教程--语言变量(五)

往期教程: Go 语言教程–介绍(一)Go 语言教程–语言结构(二)Go 语言教程–语言结构(三)Go 语言教程–数据类型(四) 文章目录 变量声明多变量声明值类型和引用类型简短形…

【微服务】springboot 适配多数据源设计与实现

目录 一、问题背景 1.1 mysql读写分离 1.2 适配多种类型数据库 1.3 多数据源 二、适配多数据源场景和问题 2.1 支持快速切换其他数据源 2.2 代码层面最小化改造 2.3 数据迁移问题 2.4 跨库事务问题 三、多数据源适配解决方案 3.1 自己造轮子 3.2 基于providerId方式…

年少轻狂,中年失意,晚年凄惨的杜甫

诗圣杜甫的一生,几乎和苦难、倒霉紧紧拴在了一起。 裘马轻狂,恣意漫游的青年 公元712年,发生了两件值得历史铭记的大事情。第一件事,唐玄宗在这一年继位;第二件事,伟大的诗人杜甫在这一年出生。 杜甫字子…

openstack平台IsolatedHostsFilter的使用记录

文章目录 前言已有的经验思路一:image元数据思路二:flavor元数据思路三、IsolatedHostsFilter:使用filter来限制总结 前言 甲方的云平台新到了一些海光的机器,希望能加入到已有的计算集群里面。问题不大,但是有些小的…

怎么开发zblog插件?

要开发 ZBlog 插件,可以按照以下步骤进行: 1. 创建插件目录:在 ZBlog 的插件目录中创建一个新的目录,目录名称即为插件的名称,例如 "myplugin"。 2. 创建插件入口文件:在插件目录下创建一个 PHP …

Android Studio实现内容丰富的安卓宿舍管理平台

如需源码可以添加q-------3290510686,也有演示视频演示具体功能,源码不免费,尊重创作,尊重劳动。 项目编号086 1.开发环境 android stuido jdk1.8 eclipse mysql tomcat 2.功能介绍 安卓端: 1.注册登录 2.查看公告 3.报…

docker 教程笔记,win11

1、如何执行container 当git clone一个带Dockerfile的项目时,先打开终端,跳转到该项目文件夹。 使用如下命令构建镜像image docker build -t project_name . 注: project_name为该项目名,后面必须要有空格和点。 执行完毕后&#…

「TCG 规范解读」TCG 规范架构概述(下)

修订历史: 2023.3.4 2023.6.18 2023.7.2 可信计算组织(Ttrusted Computing Group, TCG)是一个非盈利的工业标准组织,它的宗旨是加强不同计算机平台上计算环境的安全性。TCG 于 2003 年春成立,并采纳了由可信计算平台联盟(the Trusted Computing Platform Alliance, TCPA)…

python函数的基本定义

python定义函数的规则: 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号(); 任何传入参数和自变量必须放在圆括号中间。圆括号之间可以用于定义参数; 函数的第一行语句可以选择性地使用文档字符串—用于存放函数…

Axure设计之文章目录动态定位导航教程

博客类型的内容网站,文章目录能很好的提升用户体验,通过目录可以清除整体结构,还可以通过目录进行导航,定位要浏览内容所在位置。下面通过Axure工具使用简单的元件实现文章目录导航的效果。 一、案例效果 1、页面左侧为文章目录&a…

Spring 系列1 -- 初识Spring

目录 1. Spring是什么? 2. DI 概念说明 3. 总结 1. Spring是什么? 我们通常所说的Spring指的是Spring Framework(Spring框架),他是一个开源框架,有着庞大的社区.Spring ⽀持⼴泛的应⽤场景,它可以让 Java 企业级的应用程序开发起来更简单.用一句话来概述就是Spri…

nginx缓存配置

nginx缓存配置 在http模块下配置在server模块下配置简单验证下nginx服务器配置客户机访问nginx缓存服务器 在http模块下配置 注意/data/nginx/cache要自己创建 http {proxy_cache_path /data/nginx/cache levels1:2 keys_zonemy_cache:10m max_size10g inactive60m use_temp_…

Kafka基础入门篇

一、kafka简介 其主要设计目标如下: 以时间复杂度为O(1)的方式提供消息持久化能力,即使对TB级以上数据也能保证常数时间的访问性能高吞吐率。即使在非常廉价的机器上也能做到单机支持每秒100K条消息的传输支持Kafka Server间的消息分区,及分…

资源释放的方式

资源释放通常指的是关闭文件、网络连接、数据库连接等资源,以释放系统资源并防止资源泄漏。 1:try-catch-finally finally:在异常处理时提供finally块来执行所有清除操作,比如IO流中的释放资源特点:被finally控制的语句最终一定…

浅析高速公路隧道变电所智能照明控制方案

【摘要】:目前公路隧道无人值守变电所均已设置了视频监控设施,在日常运营中由于光线不足,隧道监控室人员无法远程巡视,存在监控的盲检、漏检问题。该问题存在是由于传统照明方式无法完远程开启照明设施,文章针对该问题…

FPGA入门系列12--RAM的使用1

文章简介 本系列文章主要针对FPGA初学者编写,包括FPGA的模块书写、基础语法、状态机、RAM、UART、SPI、VGA、以及功能验证等。将每一个知识点作为一个章节进行讲解,旨在更快速的提升初学者在FPGA开发方面的能力,每一个章节中都有针对性的代码…

使用linux的系统驱动点灯

使用linux的系统驱动点亮开发板的灯 **要求:**使用linux驱动点亮开发板的灯 实验现象 (LED1没亮是因为本人的开发板LED1物理损坏) head.h代码 #ifndef __HEAD_H__ #define __HEAD_H__typedef struct{volatile unsigned int moder;volatil…

DAY38:贪心算法(六)分发糖果+柠檬水找零

文章目录 135.分发糖果思路第一种情况:右>左第二种情况:左>右(倒序遍历)两种情况的结果合并,通过取最大值 完整版总结 860.柠檬水找零思路完整版总结 135.分发糖果 本题涉及到一个思想,就是处理好一…

位图的详解

目录 位图 位图的概念 位图的实现 位图常见三道面试题 1.给定100亿个整数,设计算法找到只出现一次的整数? 2. 给两个文件,分别有100亿个整数,我们只有1G内存,如何找到两个文件交集? 3. 位图应用变形…

C#程序以管理员权限运行

在Vista 和 Windows 7 及更新版本的操作系统,增加了 UAC(用户账户控制) 的安全机制,如果 UAC 被打开,用户即使以管理员权限登录,其应用程序默认情况下也无法对系统目录、系统注册表等可能影响系统正常运行的设置进行写操作。这个机…