編程學習網 > IT圈內 > 下個版本已定!C++自救新動作!
2023
06-26

下個版本已定!C++自救新動作!

自去年年底,美國安全局(NSA)在其所發布的《Software Memory Safety》報告中點名批評C++之后,C++之父Bjarne Stroustrup一頓回懟后,做出決定:內部自救?,F在,就讓我們看看下一個版本的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,雖然它適用于多線程,但如果寫入和讀取恰好在統一線程上,一樣有效?!?/span>

Sutter表示,“并發和并行子組仍在推進C++26的std::execution和SIMD并行”,這將是并發編程的重要功能。

后來者帶來的壓力

相較于Sutter對于C++標準的穩步發展的熱情,編程領域內對于新語言的呼聲卻越來越高。前不久,微軟首席技術官Mark Russinovich宣布,“是時候停止用C/C++啟動任何新項目,并在需要非GC語言的情況下使用Rust了。為了安全和可靠性,行業應該宣布這些語言不受歡迎?!?/span>

除了Rust,C++的另一個潛在競爭對手是谷歌的實驗性項目:Carbon;甚至就連Sutter自己,也提出了實驗性的cppfront,他說:“我的目標是探索是否有一種方法,可以使C++變得更簡單、更安全、更可工具化10倍!”cppfrond語言由Sutter于2022年底在CppCon上提出。

然而,新語言的一個問題是大量的現有代碼永遠不會被移植,這意味著改進C++仍然是值得的,即使對于那些認為它有固有缺陷或過于復雜的人來說也是如此。

越來越不像C++了

對于一門上世紀誕生的骨灰級編程語言來說,C++可謂非常成功。然而,許多C++愛好者中,流行一種說法:C++11以后,C++也越來越不像C++了。它完全是一門新的語言。

C++活生生把自己變成了一個筐,缺啥東西都得裝。網友抱怨:明明是一個聚焦底層的語言,為什么很多人幻想在標準庫里放各種迎合千奇百怪需求的上層庫呢?

與其這樣,還不如多關注C++本身底層的改進,好好維護發展庫生態。

寫在最后

誠然,許多新語言都踩在舊語言的肩膀上,而且是從舊語言犯過的錯誤中汲取養料,茁壯起來。Rust從C++中學到了內存安全的重要性,Zig從C中選擇了更細分的內存分配,Go則帶上“指針”和“垃圾收集”兩件法寶自成一派。

而C++曾經也是一位昂揚向上的少年,只不過經歷了40年之久的他,已經無須證明自己有多么成功?,F在C++很清醒:它已經是一個老語種,身上的包袱很重,更需要穩定地負責任地承載著過去的版本,同時一路吸收著后來的其他語言“小弟”們創新點,慢慢前行。

以上就是下個版本已定!C++自救新動作!”的詳細內容,想要了解更多IT圈內資訊歡迎持續關注編程學習網。

掃碼二維碼 獲取免費視頻學習資料

Python編程學習

查 看2022高級編程視頻教程免費獲取