![]()
作者 | Sergio De Simone
譯者 | 田橙
長期從事 C++ 的專家、前 ISO C++ 標準委員會主席 Herb Sutter 表示,C++26 標準草案現(xiàn)已完成。最終版本的草案引入了反射,在無需重寫代碼的情況下增強了內(nèi)存安全性,新增了包含前置條件和后置條件的契約以及一種新的斷言語句,并建立了一個統(tǒng)一的并發(fā)與并行框架。
反射是一種機制,正如 Sutter 所解釋的,它賦予開發(fā)者訪問 C++ 內(nèi)部機制的能力,使語言能夠描述自身并生成代碼,從而為元編程提供堅實基礎(chǔ)。秉承 C++ 的精神,反射不會帶來任何運行時開銷。作為反射能力的一個基本示例,下面的代碼片段展示了反射如何支持一種用于聲明 C++ 接口的專用語法:
};反射可以通過減少對大量定制化新語言特性的需求來簡化 C++ 的未來演進,因為許多特性現(xiàn)在都可以表示為可復用的編譯期庫,設(shè)計更快、測試更容易,并且從一開始就具備可移植性。
接口抽象是 cppfront 的一部分,cppfront 是一個可編譯為純 ISO C++ 的編譯器,由 Sutter 創(chuàng)建,用于提供一種更快速的提案實驗方式。它還包括諸如 copyable(用于表達支持復制 / 移動構(gòu)造與賦值的類型)、ordered(用于定義帶有 operator<=> 的全序類型)、union(用于帶名稱的標簽聯(lián)合)、regex 等抽象,以及更多內(nèi)容。
C++26 旨在帶來顯著改進的另一個領(lǐng)域是 內(nèi)存安全。這包括開箱即用地消除讀取未初始化局部變量時的未定義行為,以及為大多數(shù)標準庫類型(包括 vector、span、string、string_view)提供邊界安全。Sutter 表示,這些改動已經(jīng)在 Apple 和 Google 的生產(chǎn)環(huán)境中部署,覆蓋了數(shù)億行 C++ 代碼:
這并非紙上談兵。僅在 Google 內(nèi)部,它已經(jīng)修復了超過 1000 個缺陷,預計每年可防止 1000 到 2000 個缺陷,并將生產(chǎn)環(huán)境中的段錯誤發(fā)生率降低了 30%。
更重要的是,這些收益僅通過使用新編譯器重新編譯現(xiàn)有代碼即可獲得。只有在七個案例中,編譯器無法分析高度優(yōu)化的代碼,需要開發(fā)者使用細粒度 API 在這些特定部分選擇性地退出內(nèi)存安全機制。
C++26 契約將 防御式編程 引入語言本身,提升了功能安全性和內(nèi)存安全性。它允許開發(fā)者表達在方法執(zhí)行過程中不可被違反的前置條件和后置條件。契約使斷言可以移動到函數(shù)聲明中,從而對調(diào)用者和靜態(tài)分析工具可見。C++ 提供了四種處理契約違規(guī)的方式:忽略(ignore)、觀察(observe)、強制(enforce)以及快速強制(quick enforce)。此外,它還引入了原生斷言機制,用以替代 C 的 assert 宏。
最后,C++26 引入了 std::execution,作為一個用于表達和控制并發(fā)與并行的框架。該框架的三個主要抽象是調(diào)度器(schedulers)、發(fā)送器(senders)和接收器(receivers),它們可以通過一組可定制的異步算法進行組合。std::execution 被設(shè)計為能夠很好地與 C++20 協(xié)程協(xié)同工作,并使編寫“使用結(jié)構(gòu)化(嚴格生命周期嵌套)的并發(fā)與并行、從構(gòu)造上避免數(shù)據(jù)競爭的程序”變得更加容易。
兩大主流 C++ 編譯器 GCC 和 Clang 已經(jīng)在標準制定過程中實現(xiàn)了 C++26 的大部分特性,這些特性很快將進入主線版本。
https://www.infoq.com/news/2026/04/cpp-26-reflection-safety-async/
特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺“網(wǎng)易號”用戶上傳并發(fā)布,本平臺僅提供信息存儲服務(wù)。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.