熟悉我的朋友大概知道我最近翻譯了一本介紹C++20特性的“小紅書”《C++20高級編程》(第五版)C++標(biāo)準(zhǔn)委員會Marc Gregoire著這個版本滿足了我對C++絕大多數(shù)的幻想。
通過Modules淘汰了C++之前編寫大程序的陳舊方式;
使用Concepts幫助創(chuàng)建類型安全的模板和實(shí)現(xiàn)靈活的模板特化;
使用Ranges徹底改變了處理數(shù)據(jù)的方式。
這些新功能可以使C++比之前更簡單、更優(yōu)雅、更容易理解。
上圖說明了C++20新增的內(nèi)容,除了模塊、概念、范圍和協(xié)程四大模塊之外,上圖框出部分極大地反映了C++對并發(fā)的支持,C++20增加了很多在其他語言看起來應(yīng)有的東西如:信號量,鎖存器,屏障,可等待通知的原子類型,原子引用,線程安全的原子智能指針。
加上之前就有的各種并發(fā)支持:各種鎖,線程,條件變量,異步,package_task,C++20對并發(fā)的支持可以說是最完善的了,遠(yuǎn)遠(yuǎn)超過其他語言,并且十分高效。
總結(jié)一下C++20在庫特性和語言特性上的新變化:
在庫特性方面
C++20使用std::format替代printf,豐富了I/O流,chrono增加了對日歷和時區(qū)的支持,增加std::atomic<std::shared_ptr>std::atomic<float>等,使用std::source_lacation替代_LINE_、_func_宏,使用std::span表示一個片段。
C++20中的std::endian可獲取當(dāng)前平臺是大端序還是小端序,std::make_shared支持構(gòu)造數(shù)組,std::remove_cvref移除cv和ref,std::to_address可獲取地址,std::assume_aligned可指定內(nèi)存對齊。C++20中可以使用midpoint計(jì)算中位數(shù)、lerp計(jì)算線性差值,std::is_bounded_array檢查數(shù)組是不是有界,并添加了Ranges庫以用來處理元素范圍和的組件。
此外,C++20中增加了barrier屏障、latch、counting_semaphore信號量、std::jthread、bind_front、std::size:signedsize、std::basic_osynacstream和string系列操作string::starts_with、ends_with等。
最后,添加了e、log2e、log10e、pi、inv_pi、inv_sqrtpi、ln2、ln10、sqrt2、sqrt3、inv_sqrt3、egamma、phi等數(shù)字常量。
在語言特性方面
C++20添加了比較運(yùn)算符號<==>,for loop內(nèi)初始化變量、[[no_unique_address]]、[[likely]]、[[unlikely]]、consteval、constint。C++20中,可使用lambda表達(dá)式捕獲this方式,lambda表達(dá)式可以使用模板,某些時候不需要使用typename,結(jié)構(gòu)體可以直接初始化。C++20支持協(xié)程、支持modules、可以using enum、引用約束和概念,且函數(shù)模板可以縮寫。
其中,最重要的四大概念分別是概念(concept)、范圍 (ranges)、協(xié)程(coroutines)和模塊(module)。
使用模板
進(jìn)行通用編程的關(guān)鍵思想是定義能通過各種類型(type)使用的函數(shù)和類,但是在實(shí)例化模板時經(jīng)常會出現(xiàn)用錯類型的問題,其結(jié)果通常是幾頁難懂的報錯信息。概念將改變這個問題,讓編程者為模板編寫要求,而編譯器則可以檢查這個要求。概念革新了思考和編寫通用代碼的方式,因?yàn)槟0宓囊笫墙涌诘囊徊糠郑惸0逯械暮瘮?shù)重載和特殊化可以基于概念進(jìn)行,且編譯器能夠比較模板參數(shù)的要求與實(shí)際的模板參數(shù),所以能得到更好的報錯信息。
使用概念,編程者可以使用預(yù)定義的概念,也可以定義自己的概念。C++20將auto和概念的用法統(tǒng)一到了一起,可以不使用auto,而是使用概念。如果一個函數(shù)聲明使用了一個概念,那么它會自動變成一個函數(shù)模板,由此,編寫函數(shù)模板就變得與編寫函數(shù)一樣簡單。
范圍庫
使其能夠在容器上直接表達(dá)算法,通過管道符號組合算法,并將其用于數(shù)據(jù)流中。范圍是概念的首個客戶,它支持的算法滿足以下條件:可以直接在容器上操作,無需迭代器指定范圍;可以寬松地評估;可以組合。簡單來說,范圍支持函數(shù)模式。
協(xié)程
是廣義的函數(shù),能在保持狀態(tài)的同時暫停或繼續(xù)。協(xié)程讓C++異步編程能力更加強(qiáng)大,甚至可能成為主流,是多任務(wù)合作、事件循環(huán)、管道的基礎(chǔ)。協(xié)程通常用來編寫事件驅(qū)動型應(yīng)用。事件驅(qū)動型應(yīng)用可以是模擬、游戲、服務(wù)器、用戶接口或算法。協(xié)程通常也被用于協(xié)作式多任務(wù)。
模塊
引進(jìn)了import官架子,讓C++在#include的基礎(chǔ)上支持更現(xiàn)代化的模塊設(shè)計(jì),減輕傳統(tǒng)頭文件帶來的一些問題,提升編譯的速度,并帶來更簡單的構(gòu)建包的方式。模塊能夠?qū)崿F(xiàn)更快的編譯時間、宏的隔離、表達(dá)代碼的邏輯結(jié)構(gòu)、不必再使用頭文件,且能夠擺脫丑陋的宏方法。
總之,C++20作為一個重大版本發(fā)布,又給C++帶來了更多新的可能。
作為譯者,就算有王婆賣瓜之嫌和親媽濾鏡之感,但以一個C++程序員的視角看《C++20高級編程》還是頗有可取之處。
作者比利時C++用戶組的創(chuàng)始人、C++標(biāo)準(zhǔn)委員會委員Marc Gregoire以豐富的編程經(jīng)驗(yàn),在全新的角度對C++進(jìn)行了介紹。第一部分是C++基礎(chǔ)速成教程,介紹了簡潔的語法、字符串以及清晰易懂的編碼風(fēng)格,第二部分介紹C++設(shè)計(jì)方法論,討論軟件設(shè)計(jì)、面向?qū)ο笤O(shè)計(jì)、可重用代碼設(shè)計(jì),第三部分從專業(yè)角度分析C++編程技術(shù),第四部分講解如何真正掌握C++的高級功能,第五部分重點(diǎn)介紹C++軟件工程技術(shù)。并且附錄中還贈了求職問題合集,提供了關(guān)于C++的各種知識點(diǎn)需要記住的內(nèi)容,以及求職者可能面對的各種不同類型的問題。
這個系列還有個兄弟本《C++20實(shí)踐入門》,也叫新手本,套裝如下,現(xiàn)在活動直降193,直接5折帶走,更劃算!
老規(guī)矩,評論區(qū)挑5個老鐵送書!
截止時間:2022年9月27日(周二)晚八點(diǎn)