關(guān)于我們
書單推薦
新書推薦
|
C++高性能編程 本書共分為14 章,包括C++概述,C++必b備技能,分析和度量性能,數(shù)據(jù)結(jié)構(gòu),算法,范圍和視圖,內(nèi)存管理,編譯時(shí)編程,Utilities 基礎(chǔ),代理對(duì)象和惰性求值,并發(fā),協(xié)程和惰性生成器,用協(xié)程進(jìn)行異步編程和并行算法。 本書期望你具備基本的C++和計(jì)算機(jī)體系結(jié)構(gòu)知識(shí),并對(duì)提升自身專業(yè)技能真正感興趣。希望閱讀本書后,能對(duì)如何在性能和語(yǔ)法上改進(jìn)自己的C++代碼有更深入的認(rèn)識(shí)。 前言 現(xiàn)今的C++語(yǔ)言為開(kāi)發(fā)者提供了“編寫富有表現(xiàn)力和健壯性代碼的能力,同時(shí)幾乎可在所有硬件平臺(tái)上運(yùn)行,并滿足關(guān)鍵性能要求”。這使得C++成為一門獨(dú)特的語(yǔ)言。在過(guò)去幾年中,C++已經(jīng)演變?yōu)橐环N現(xiàn)代化語(yǔ)言,使用更加有趣,并具有更實(shí)用的默認(rèn)功能。 本書的目標(biāo)是,為你奠定編寫高效應(yīng)用程序堅(jiān)實(shí)的基礎(chǔ),并深入了解現(xiàn)代C++中實(shí)現(xiàn)庫(kù)的策略。與講述C++的歷史相比,我更傾向于以實(shí)踐為導(dǎo)向的形式介紹當(dāng)前C++的運(yùn)行方式,包括其組成部分以及在C++17 和C++20 中引入的特性。 考慮到C++20 中新增的特性,在編寫本書時(shí),我引入了能夠與本書內(nèi)容和重點(diǎn)相吻合的新特性。新特性更多的是關(guān)于概念的介紹,包含了少量的最佳實(shí)踐和經(jīng)過(guò)驗(yàn)證的解決方案。 在本書出版時(shí),編譯器對(duì)書中介紹的一些C++20 特性的支持仍處于試驗(yàn)階段。如果在出版日期閱讀,可能需要一段時(shí)間才會(huì)被編譯器完全支持。 此外,本書的許多章節(jié)難度跨度較大。它們從絕對(duì)的基礎(chǔ)知識(shí)開(kāi)始,一直延伸到高級(jí)主題,如自定義內(nèi)存分配器。你可以隨時(shí)跳過(guò)某一節(jié),以后再來(lái)學(xué)習(xí)。除了前三章之外,大多數(shù)章節(jié)都可以獨(dú)立閱讀。 我們主要的技術(shù)審校者Timur Doumler 對(duì)本書的新版本影響深遠(yuǎn)。他的熱情和積極的反饋?zhàn)尡緯谝话娴牟糠謨?nèi)容得以重新修訂,呈現(xiàn)出更徹底、更深入地講解。C++20 的新特性自然地融入各章,Timur 也是重要的貢獻(xiàn)者。此外,Arthur O'Dwyer、Marius Bancila 和Lewis Baker 也審校了該書的部分內(nèi)容。有如此多出色的審校者們參與到這個(gè)項(xiàng)目中,著實(shí)是件令人高興的事情。希望你喜歡這個(gè)新版本,就像我享受編寫它一樣。 本書的目標(biāo)讀者 本書期望讀者具備基本的C++和計(jì)算機(jī)體系結(jié)構(gòu)知識(shí),并對(duì)提升自身專業(yè)技能真正感興趣。希望閱讀本書后,能對(duì)如何在性能和語(yǔ)法上改進(jìn)自己的C++代碼有更深入的認(rèn)識(shí)。此外,希望你在閱讀本書時(shí),能夠有一些頓悟時(shí)刻。 本書涵蓋的內(nèi)容 第1 章,C++概述,介紹了C++的重要特性,如零成本抽象、值語(yǔ)義、常量正確性、顯式所有權(quán)和錯(cuò)誤處理。同時(shí),本章還探討了C++的缺點(diǎn)。 第2 章,C++必b備技能,描述了使用auto 進(jìn)行自動(dòng)類型推導(dǎo)、lambda 函數(shù)、move 語(yǔ)義和錯(cuò)誤處理。 第3 章,分析和度量性能,將教你如何使用大O 符號(hào)來(lái)分析算法的復(fù)雜度,以及如何對(duì)代碼進(jìn)行剖析以找到性能瓶頸,并介紹了使用Google Benchmark 進(jìn)行性能測(cè)試的方法。 第4 章,數(shù)據(jù)結(jié)構(gòu),闡述了構(gòu)建高效數(shù)據(jù)結(jié)構(gòu)的重要性,以便快速訪問(wèn)數(shù)據(jù)。同時(shí)介紹了標(biāo)準(zhǔn)庫(kù)中的容器,如std::vector,std::list、std::unordered_map 和std::priority_queue。本章最后還演示了如何使用并行數(shù)組。 第5 章,算法,介紹了標(biāo)準(zhǔn)庫(kù)中最重要的算法。將學(xué)習(xí)如何使用迭代器(Iterator)和范圍(Ranges)處理數(shù)據(jù),以及如何實(shí)現(xiàn)自己的通用算法。 第6 章,范圍和視圖,將學(xué)習(xí)如何使用C++20 中引入的Ranges 庫(kù)來(lái)組織算法,以及Ranges 庫(kù)視圖的實(shí)用性以及惰性求值的好處。 第7 章,內(nèi)存管理,重點(diǎn)關(guān)注安全而高效的內(nèi)存管理。內(nèi)容包括內(nèi)存所有權(quán)、RAII、智能指針、堆棧內(nèi)存、動(dòng)態(tài)內(nèi)存和自定義內(nèi)存分配器。 第8 章,編譯時(shí)編程,介紹使用constexpr、consteval 和類型萃取等元編程技術(shù)。你將學(xué)習(xí)如何利用C++20 的概念和Concepts 庫(kù),以及元編程的實(shí)際應(yīng)用,如反射。 第9 章,Utilities 基礎(chǔ),引導(dǎo)你了解Utilities 庫(kù),如何利用編程技術(shù)從std::optional、std::any和std::variant 等類型中受益。 第10 章,代理對(duì)象和惰性求值,探討如何在保留清晰語(yǔ)法的同時(shí),使用代理對(duì)象對(duì)內(nèi)部?jī)?yōu)化,以及操作符重載的一些創(chuàng)造性用法。 第11 章,并發(fā),涵蓋并發(fā)編程的基礎(chǔ)知識(shí),包括并行執(zhí)行、共享內(nèi)存、數(shù)據(jù)競(jìng)爭(zhēng)和死鎖。介紹了C++線程支持庫(kù)、Atomic 庫(kù)和C++內(nèi)存模型。 第12 章,協(xié)程和惰性生成器,提供對(duì)協(xié)程抽象的綜合介紹。你將學(xué)習(xí)如何在CPU 上執(zhí)行普通函數(shù)和協(xié)程,以及C++20 的無(wú)棧協(xié)程和生成器的用法。 第13 章,用協(xié)程進(jìn)行異步編程,介紹使用C++20 的無(wú)棧協(xié)程進(jìn)行并發(fā)編程,并討論使用Boost.Asio 進(jìn)行異步網(wǎng)絡(luò)編程的話題。 第14 章,并行算法,展示編寫并行算法的復(fù)雜度及如何度量其性能,以及如何利用標(biāo)準(zhǔn)庫(kù)算法和執(zhí)行策略在并行環(huán)境中進(jìn)行并行計(jì)算。 閱讀本書的必要準(zhǔn)備 為了從本書中獲得最大的收益,你確實(shí)需要具備基本的C++知識(shí)。如果你已經(jīng)遇到與性能相關(guān)的問(wèn)題,并正在尋找新的工具和實(shí)踐方法來(lái)優(yōu)化性能,那么你將能夠更好地理解和應(yīng)用本書中的內(nèi)容,并從中獲得更大的收獲。 本書包含大量代碼示例,其中一些來(lái)自真實(shí)項(xiàng)目,但大多數(shù)是經(jīng)過(guò)改造或大幅簡(jiǎn)化的示例,用于說(shuō)明概念,并不會(huì)直接提供可在生產(chǎn)環(huán)境中運(yùn)行的代碼。 我已經(jīng)按照章節(jié)將所有代碼示例劃分并放置在相應(yīng)的源文件中,這樣做可以方便快速地找到實(shí)驗(yàn)案例。此外,我還使用了Google Test 框架編寫了自動(dòng)化測(cè)試用例,以取代示例中的大部分main()函數(shù)。我希望這些改變對(duì)你有所幫助,而不會(huì)增加困惑。這樣做有助于我為每個(gè)例子提供有意義的描述,并使大家能夠更便捷地一次性運(yùn)行每章中的所有例子。 為了編譯和運(yùn)行這些示例,你將需要: ● 一臺(tái)電腦。 ● 操作系統(tǒng)(這些示例已經(jīng)在Windows、Linux 和macOS 上得到了驗(yàn)證)。 ● 編譯器(我使用的是Clang、GCC 和Microsoft Visual C++)。 ● CMake。 提供的示例代碼中的CMake 腳本將下載并安裝其他依賴項(xiàng),如Boost、Google Benchmark和Google Test。 在撰寫本書的過(guò)程中,我發(fā)現(xiàn)使用Compiler Explorer(https://godbolt.org/)非常有幫助。 它是一個(gè)在線編譯器,可以在此嘗試不同版本的編譯器。如果你尚未嘗試過(guò)這些工具,我強(qiáng)烈建議你去體驗(yàn)一下!它們將為你帶來(lái)許多便利和優(yōu)勢(shì)。 下載示例代碼文件 本書代碼托管在GitHub 上,位于https://github.com/ PacktPublishing/Cpp-High-Performance-Second-Edition。代碼會(huì)在現(xiàn)有GitHub 代碼庫(kù)中持續(xù)更新。 你可在https://github.com/PacktPublishing/找到其他由Packt 出版社出版的書籍和視頻中的代碼。 下載彩色插圖 本書還提供了一個(gè)包含本書中使用的屏幕截圖和圖表的彩色圖片的PDF 文件?稍谶@里下載該文件:https://static.packt-cdn.com/ downloads/9781839216541_ColorImages.pdf。 文本格式約定 本書使用以下文本約定。 CodeInText:表示文本、文件夾名稱、文件名、文件擴(kuò)展名、假的URL 和用戶輸入。如: “關(guān)鍵字constexpr 是在C++11 中引入的。” 以下是代碼塊的約定: #include int main() { std::cout << "High Performance C++\ } 本書在強(qiáng)調(diào)特定代碼部分時(shí)會(huì)使用粗體來(lái)標(biāo)記相關(guān)的行或項(xiàng): #include int main() { std::cout << "High Performance C++\ } 命令行的輸入輸出格式如下: $ clang++ -std=c++20 high_performance.cpp $ ./a.out $ High Performance C++ 粗體字用于表示術(shù)語(yǔ)、重要詞匯或在屏幕上可見(jiàn)的文字。例如:“填寫表格并點(diǎn)擊保存按鈕”。 警告或重要說(shuō)明會(huì)以這樣的方式呈現(xiàn)。 聯(lián)系方式 我們非常歡迎讀者的反饋。 一般反饋:如果你對(duì)本書的任何方面有疑問(wèn),請(qǐng)?jiān)卩]件主題中提及書名,并發(fā)送郵件至Packt(customercare@packtpub.com)。我們期待您的來(lái)信。 勘誤:盡管我們已盡力確保內(nèi)容的準(zhǔn)確性,但錯(cuò)誤可能仍會(huì)出現(xiàn)。如果你在本書中發(fā)現(xiàn)任何錯(cuò)誤,我們將非常感激。請(qǐng)?jiān)L問(wèn) www.packtpub.com/support/errata,選擇本書,并點(diǎn)擊“勘誤提交表格”鏈接,并輸入詳細(xì)信息。 盜版:如果你在互聯(lián)網(wǎng)上發(fā)現(xiàn)任何非法拷貝我們作品的形式,請(qǐng)向我們提供網(wǎng)址或網(wǎng)站名稱,我們將非常感激。請(qǐng)通過(guò)copyright@packt.com 與我們聯(lián)系,并提供相關(guān)材料的鏈接。 如果愿意成為作者:如果你對(duì)某個(gè)專題有深入了解,并且對(duì)撰寫書籍或投稿感興趣,請(qǐng)?jiān)L問(wèn) authors.packtpub.com。我們期待與您合作。 撰寫書評(píng) 我們期待你的寶貴評(píng)論。在閱讀并使用本書后,請(qǐng)?jiān)谫?gòu)買本書的網(wǎng)站上留下評(píng)論。供其他潛在讀者參考你的意見(jiàn),同時(shí)我們也可以了解你對(duì)Packt 產(chǎn)品的看法,而作者也能夠看到你對(duì)書籍的反饋。非常感謝你的支持! 如需了解更多關(guān)于Packt 的信息,請(qǐng)?jiān)L問(wèn) packt.com。 Bj?rn Andrist是一名自由軟件顧問(wèn),目前專注于音頻應(yīng)用程序。十多年來(lái),他一直從事C ++的專業(yè)工作,項(xiàng)目范圍從Unix服務(wù)器應(yīng)用程序到臺(tái)式機(jī)和移動(dòng)設(shè)備上的實(shí)時(shí)音頻應(yīng)用程序,擁有KTH Royal Technology Institute的計(jì)算機(jī)工程學(xué)士學(xué)位和計(jì)算機(jī)科學(xué)碩士學(xué)位。他還教授算法和數(shù)據(jù)結(jié)構(gòu),并發(fā)編程和編程方法的課程。 Viktor Sehr是Toppluva的主要開(kāi)發(fā)人員,使用針對(duì)移動(dòng)硬件的高度優(yōu)化的圖形引擎。他在使用C ++方面擁有10年的專業(yè)經(jīng)驗(yàn),并專注于實(shí)時(shí)圖形,音頻和建筑設(shè)計(jì),擁有Link?ping大學(xué)的媒體科學(xué)碩士學(xué)位。他在Mentice和Raysearch Laboratories開(kāi)發(fā)了醫(yī)學(xué)可視化軟件,并在Propellerhead Software開(kāi)發(fā)了實(shí)時(shí)音頻應(yīng)用程序。 目錄 序 前言 第1 章 C++概述 1 1.1 為什么是C++ 1 1.1.1 零成本抽象 · 1 1.1.2 可移植性 · 4 1.2 與其他語(yǔ)言對(duì)比 4 1.2.1 競(jìng)爭(zhēng)語(yǔ)言和性能 · 5 1.2.2 與性能無(wú)關(guān)的C++語(yǔ)言特性 · 7 1.2.3 C++的局限性 12 1.3 本書使用的庫(kù)和編譯器 13 1.4 總結(jié) 13 第2 章 C++必b備技能 · 14 2.1 用auto 關(guān)鍵字進(jìn)行自動(dòng)類型推斷 14 2.1.1 在函數(shù)簽名中使用auto 14 2.1.2 對(duì)變量使用auto 16 2.1.3 指針的常量傳播 18 2.2 移動(dòng)語(yǔ)義 19 2.2.1 拷貝構(gòu)造函數(shù),交換與移動(dòng) 20 2.2.2 資源獲取與五法則 22 2.2.3 具名變量和右值 25 2.2.4 默認(rèn)移動(dòng)語(yǔ)義和零法則 27 2.2.5 將&&修飾符應(yīng)用于類成員函數(shù) ·32 2.2.6 當(dāng)拷貝被省略時(shí),無(wú)論如何都不要移動(dòng) 32 2.2.7 適時(shí)使用值傳遞 33 2.3 設(shè)計(jì)帶有錯(cuò)誤處理的接口 35 2.3.1 契約 36 2.3.2 錯(cuò)誤處理 39 2.4 函數(shù)對(duì)象和lambda 表達(dá)式 46 2.4.1 C++lambda 的基本語(yǔ)法 46 2.4.2 捕獲子句 47 2.4.3 為lambda 表達(dá)式分配C 函數(shù)指針 · 53 2.4.4 Lambda 類型 · 54 2.4.5 lambda 表達(dá)式和std::function · 54 2.4.6 泛型lambda 58 2.5 總結(jié) 60 第3 章 分析和度量性能 · 61 3.1 漸進(jìn)復(fù)雜度和大O 符號(hào) 61 3.1.1 增長(zhǎng)率 66 3.1.2 均攤時(shí)間復(fù)雜度 67 3.2 度量什么?該如何度量? 69 3.2.1 性能特征 71 3.2.2 運(yùn)行時(shí)間的提升 71 3.2.3 性能計(jì)數(shù)器 72 3.2.4 最佳實(shí)踐:性能測(cè)試 73 3.3 了解代碼和熱點(diǎn) 74 3.3.1 插樁型剖析器 75 3.3.2 采樣型剖析器 77 3.4 微基準(zhǔn)測(cè)試 79 3.4.1 阿姆達(dá)爾定律 80 3.4.2 微基準(zhǔn)測(cè)試的隱患 81 3.4.3 微基準(zhǔn)測(cè)試實(shí)例 81 3.5 總結(jié) 87 第4 章 數(shù)據(jù)結(jié)構(gòu) · 88 4.1 計(jì)算機(jī)內(nèi)存的特性 88 4.2 標(biāo)準(zhǔn)庫(kù)容器 92 4.2.1 序列式容器 92 4.2.2 關(guān)聯(lián)式容器 96 4.2.3 容器適配器 ·100 4.3 使用視圖 103 4.4 性能方面的考量 106 4.4.1 在復(fù)雜度與開(kāi)銷間尋求平衡 · 106 4.4.2 了解并使用適當(dāng)?shù)腁PI 函數(shù) 107 4.5 并行數(shù)組 108 4.6 總結(jié) 115 第5 章 算法 116 5.1 標(biāo)準(zhǔn)庫(kù)算法概述 116 5.1.1 標(biāo)準(zhǔn)庫(kù)算法的演進(jìn) · 116 5.1.2 解決日常問(wèn)題 · 117 5.2 迭代器與范圍 124 5.2.1 迭代器 · 124 5.2.2 哨兵值與past-the-end 迭代器 125 5.2.3 范圍 · 126 5.2.4 迭代器類別 · 127 5.3 標(biāo)準(zhǔn)算法的特點(diǎn) 129 5.4 算法不會(huì)改變?nèi)萜鞔笮? 129 5.4.1 有輸出的算法需要自己分配數(shù)據(jù) · 130 5.4.2 算法默認(rèn)使用operator==()和operator<() 131 5.4.3 使用projection 的約束算法 132 5.4.4 算法要求move 不能拋出異常 133 5.4.5 算法具有復(fù)雜度保證 · 133 5.4.6 算法的性能與C 語(yǔ)言庫(kù)中的等價(jià)函數(shù)一樣好 134 5.5 編寫和使用泛型算法 135 5.5.1 非泛型算法 · 135 5.5.2 泛型算法 · 136 5.5.3 可被泛型算法使用的數(shù)據(jù)結(jié)構(gòu) · 137 5.6 最佳實(shí)踐 139 5.6.1 使用約束算法 · 139 5.6.2 只對(duì)需要檢索的數(shù)據(jù)進(jìn)行排序 · 139 5.6.3 使用標(biāo)準(zhǔn)算法而非原始for 循環(huán) 142 5.6.4 避免容器拷貝 · 148 5.7 總結(jié) 149 第6 章 范圍和視圖 150 6.1 Ranges 庫(kù)的動(dòng)機(jī) · 150 6.2 理解Ranges 庫(kù)中的視圖 · 153 6.2.1 視圖是可組合的 ·154 6.2.2 范圍視圖帶有范圍適配器 ·155 6.2.3 視圖是具有復(fù)雜度保證的非具權(quán)范圍 ·156 6.2.4 視圖不改變底層容器 ·157 6.2.5 視圖可以被具體化為容器 ·157 6.2.6 視圖是惰性求值的 ·158 6.3 標(biāo)準(zhǔn)庫(kù)中的視圖 160 6.3.1 范圍視圖 ·160 6.3.2 生成視圖 ·160 6.3.3 轉(zhuǎn)換視圖 ·160 6.3.4 再談std::string_view 與std::span 162 6.4 Ranges 庫(kù)的未來(lái) · 164 6.5 總結(jié) 164 第7 章 內(nèi)存管理 165 7.1 計(jì)算機(jī)內(nèi)存 165 7.1.1 虛擬地址空間 ·165 7.1.2 內(nèi)存頁(yè) ·166 7.1.3 抖動(dòng) ·167 7.2 進(jìn)程內(nèi)存 167 7.2.1 棧內(nèi)存 ·168 7.2.2 堆內(nèi)存 ·171 7.3 內(nèi)存中的對(duì)象 172 7.3.1 創(chuàng)建與銷毀對(duì)象 ·172 7.3.2 內(nèi)存對(duì)齊 ·176 7.3.3 內(nèi)存補(bǔ)齊 ·179 7.4 內(nèi)存所有權(quán) 182 7.4.1 隱式處理資源 ·183 7.4.2 容器 ·185 7.4.3 智能指針 ·185 7.5 小對(duì)象優(yōu)化 188 7.6 自定義內(nèi)存管理 191 7.6.1 創(chuàng)建arena 192 7.6.2 自定義內(nèi)存分配器 · 196 7.6.3 使用多態(tài)內(nèi)存分配器 · 201 7.6.4 實(shí)現(xiàn)自定義內(nèi)存資源 · 205 7.7 總結(jié) 207 第8 章 編譯時(shí)編程 208 8.1 模板元編程介紹 208 8.2 創(chuàng)建模板 209 8.3 使用整數(shù)作為模板參數(shù) 211 8.4 提供模板的特化 212 8.5 編譯器如何處理模板函數(shù) 212 8.6 縮寫函數(shù)模板 213 8.7 使用decltype 接收變量類型 214 8.8 類型萃取 215 8.8.1 類型萃取的類別 · 215 8.8.2 類型萃取的使用 · 216 8.9 常量表達(dá)式的使用 217 8.9.1 運(yùn)行時(shí)環(huán)境中的constexpr 函數(shù) 218 8.9.2 使用consteval 聲明即時(shí)函數(shù) 219 8.9.3 編譯時(shí)多態(tài)與運(yùn)行時(shí)多態(tài) · 222 8.9.4 示例:使用if constexpr 的泛型取模函數(shù) 223 8.10 編譯時(shí)檢查程序錯(cuò)誤 224 8.10.1 利用assert 在運(yùn)行時(shí)觸發(fā)錯(cuò)誤 224 8.10.2 利用static_assert 在編譯時(shí)觸發(fā)錯(cuò)誤 · 225 8.11 約束與概念 226 8.11.1 Point2D 模板,無(wú)約束版 · 226 8.11.2 泛型接口與不友好的報(bào)錯(cuò)信息 227 8.11.3 約束和概念的語(yǔ)法 229 8.11.4 標(biāo)準(zhǔn)庫(kù)中的概念 234 8.12 元編程實(shí)例 235 8.12.1 示例1:創(chuàng)建通用的安全強(qiáng)制轉(zhuǎn)換函數(shù) 235 8.12.2 示例2:在編譯時(shí)對(duì)字符串進(jìn)行哈希處理 238 8.13 總結(jié) · 245 第9 章 Utilities 基礎(chǔ) · 246 9.1 用std::optional 表示可選值· 246 9.1.1 可選的返回值 ·247 9.1.2 可選的成員變量 ·248 9.1.3 避免在枚舉中使用空狀態(tài) ·248 9.1.4 std::optional 的排序與比較 249 9.2 固定大小的異質(zhì)集合 250 9.2.1 std::pair 250 9.2.2 std::tuple 251 9.2.3 訪問(wèn)元組中的成員 ·252 9.2.4 遍歷std::tuple 的元素 ·253 9.2.5 元組展開(kāi) ·254 9.2.6 為元組實(shí)現(xiàn)其他算法 ·255 9.2.7 元組元素訪問(wèn) ·256 9.2.8 結(jié)構(gòu)化綁定 ·257 9.3 可變參數(shù)模板 258 9.4 可動(dòng)態(tài)調(diào)整大小的異質(zhì)集合 261 9.4.1 std::variant 262 9.4.2 std::variant 的異常安全性 264 9.4.3 訪問(wèn)variant ·265 9.5 使用了variant 的異質(zhì)集合 · 266 9.5.1 訪問(wèn)variant 容器中的值 267 9.5.2 全局函數(shù)std::get() 268 9.6 實(shí)際案例 269 9.6.1 示例1:投影與比較運(yùn)算符 269 9.6.2 示例2:反射 270 9.7 總結(jié) 273 第10 章 代理對(duì)象和惰性求值 · 274 10.1 惰性求值和代理對(duì)象簡(jiǎn)介· 274 10.1.1 惰性求值與急切計(jì)值 274 10.1.2 代理對(duì)象 275 10.2 避免使用代理對(duì)象構(gòu)建對(duì)象 276 10.2.1 使用代理比較連接的字符串 276 10.2.2 實(shí)現(xiàn)代理 277 10.2.3 右值修飾符 278 10.2.4 存儲(chǔ)拼接好的代理對(duì)象 279 10.2.5 性能評(píng)估 279 10.3 延遲sqrt 計(jì)算 280 10.3.1 一個(gè)簡(jiǎn)單的二維向量類 280 10.3.2 示例背后的數(shù)學(xué)概念 281 10.3.3 實(shí)現(xiàn)LengthProxy · 283 10.3.4 用LengthProxy 比較長(zhǎng)度 285 10.3.5 用LengthProxy 計(jì)算長(zhǎng)度 286 10.3.6 性能評(píng)估 287 10.4 探索運(yùn)算符重載和代理對(duì)象 289 10.5 總結(jié) 291 第11 章 并發(fā) · 292 11.1 了解并發(fā)的基本概念 292 11.2 是什么讓并發(fā)編程變得困難? 293 11.3 并發(fā)和并行 293 11.3.1 時(shí)間切片 294 11.3.2 共享內(nèi)存 295 11.3.3 數(shù)據(jù)競(jìng)爭(zhēng) 296 11.3.4 互斥鎖 298 11.3.5 死鎖 299 11.3.6 同步任務(wù)與異步任務(wù) 299 11.4 C++中的并發(fā)編程 · 300 11.4.1 線程支持庫(kù) 301 11.4.2 C++20 中其他的同步原語(yǔ) 315 11.4.3 C++中的原子操作 326 11.4.4 C++內(nèi)存模型 335 11.5 無(wú)鎖編程 339 11.6 性能指南 341 11.6.1 避免競(jìng)爭(zhēng) 341 11.6.2 避免阻塞操作 342 11.6.3 線程/CPU 核數(shù) ·342 11.6.4 線程優(yōu)先級(jí) 343 11.6.5 線程親和性 343 11.6.6 偽共享 344 11.7 總結(jié) · 345 第12 章 協(xié)程和惰性生成器 · 346 12.1 幾個(gè)引人入勝的例子 · 347 12.2 協(xié)程抽象 · 348 12.2.1 子例程和協(xié)程 349 12.2.2 在CPU 上運(yùn)行子例程和協(xié)程 350 12.2.3 無(wú)棧協(xié)程和有棧協(xié)程 358 12.2.4 目前為止所學(xué)的內(nèi)容 360 12.3 C++中的協(xié)程 · 360 12.3.1 標(biāo)準(zhǔn)C++中協(xié)程的涵蓋內(nèi)容 361 12.3.2 C++函數(shù)成為協(xié)程的關(guān)鍵是什么? ·361 12.3.3 一個(gè)最簡(jiǎn)但完整的示例 363 12.3.4 分配協(xié)程狀態(tài) 368 12.3.5 避免懸空引用 370 12.3.6 錯(cuò)誤處理 375 12.3.7 自定義點(diǎn) 375 12.4 生成器 · 376 12.4.1 實(shí)現(xiàn)生成器 376 12.4.2 使用Generator 類 ·380 12.4.3 在實(shí)際工作中使用生成器 387 12.5 性能 · 395 12.6 總結(jié) · 395 第13 章 用協(xié)程進(jìn)行異步編程 · 396 13.1 再談可等待類型 · 396 13.2 實(shí)現(xiàn)一個(gè)基本任務(wù)類型 · 398 13.2.1 處理返回值和異常 401 13.2.2 恢復(fù)等待中的協(xié)程 402 13.2.3 支持void Task 404 13.2.4 同步等待任務(wù)完成 406 13.2.5 使用sync_wait()測(cè)試異步任務(wù) 411 13.3 封裝基于回調(diào)的API · 412 13.4 使用Boost.Asio 實(shí)現(xiàn)的并發(fā)服務(wù)器 416 13.4.1 實(shí)現(xiàn)服務(wù)器 416 13.4.2 運(yùn)行并連接服務(wù)器 418 13.4.3 在服務(wù)器示例中實(shí)現(xiàn)的(以及未實(shí)現(xiàn)的)功能 419 13.5 總結(jié) 420 第14 章 并行算法 · 421 14.1 并行的重要性 421 14.2 并行算法 421 14.2.1 度量并行算法 422 14.2.2 回顧阿姆達(dá)爾定律 423 14.2.3 實(shí)現(xiàn)并行std::transform() · 424 14.2.4 并行化std::count_if() 434 14.2.5 并行化std::copy_if() 435 14.3 標(biāo)準(zhǔn)庫(kù)中的并行算法 441 14.3.1 執(zhí)行策略 442 14.3.2 異常處理 446 14.3.3 并行算法的新增和修改 447 14.3.4 并行化基于索引的for 循環(huán) 449 14.4 在GPU 上執(zhí)行算法 450 14.5 總結(jié) 451 14.6 分享經(jīng)驗(yàn) 452
你還可能感興趣
我要評(píng)論
|