Skip to content

Latest commit

 

History

History
130 lines (74 loc) · 9.43 KB

File metadata and controls

130 lines (74 loc) · 9.43 KB

零、前言

今天的 C++ 为程序员提供了编写富于表现力和健壮的代码的能力,同时仍然可以针对几乎任何硬件平台,同时满足性能关键的要求。这使得 C++ 成为一种独特的语言。在过去的几年里,C++ 已经变成了一种现代语言,使用起来更有趣,并且有更好的默认值。

这本书旨在为您编写高效的应用打下坚实的基础,并深入了解在现代 C++ 中实现库的策略。我试图用一种实用的方法来解释今天 C++ 是如何工作的,其中来自 C++ 17 和 C++ 20 的特性是语言的自然组成部分,而不是从历史上来看 C++。

第二版是为了涵盖 C++ 20 中增加的新特性而编写的。我已经包含了我认为与本书其余内容和重点非常契合的功能。自然,讨论新特性的章节更多的是作为介绍,包含较少的最佳实践和经验证的解决方案。

在出版这本书的时候,编译器对一些 C++ 20 特性的支持仍然是实验性的。如果你在接近出版日期的时候阅读这本书,你可能需要等待一些特性被你的编译器完全支持。

许多章节跨越了广泛的困难。它们以绝对的基础知识开始,以高级主题(如自定义内存分配器)结束。如果某个部分与您无关,请随意跳过或稍后再来。除了前三章,大部分章节都可以独立阅读。

我们的主要技术评论家,帖木儿·杜姆勒,对这个新版本产生了很大的影响。他的热情和出色的反馈导致了第一版的一些章节被重写,以更彻底和更深入地解释主题。帖木儿在将新的 C++ 20 特性融入到它们自然适合的章节中时,也是一个重要的贡献者。阿瑟·奥德怀尔、马里乌斯·班希拉和刘易斯·贝克也对这本书的某些部分进行了评论。在这个项目上有如此优秀的评审是一种真正的快乐。我希望你和我一样喜欢阅读这个新版本。

这本书是给谁的

这本书期望你对 C++ 和计算机体系结构有基本的了解,并对发展你的技能有真正的兴趣。希望当你读完这本书的时候,你已经获得了一些关于如何改进 C++ 应用的见解,包括性能和语法。除此之外,我也希望你能有几个“啊哈”的时刻。

这本书涵盖了什么

第一章C++ 简介介绍了 c++ 的一些重要性质,如零成本抽象、值语义、常量正确性、显式所有权和错误处理。它还讨论了 C++ 的缺点。

第 2 章基本 C++ 技术,概述了使用 auto、lambda 函数、移动语义和错误处理的自动类型推断。

第三章分析和测量性能,将教你如何使用大 O 符号分析算法复杂度。本章还讨论了如何分析代码以发现热点,以及如何使用谷歌基准测试设置性能测试。

第 4 章数据结构,带您了解结构化数据的重要性,以便快速访问。引入了标准库中的容器,如std::vectorstd::liststd::unordered_mapstd::priority_queue。最后,本章演示如何使用并行数组。

第五章算法,介绍了标准库中最重要的算法。您还将学习如何使用迭代器和范围,以及如何实现自己的通用算法。

第 6 章范围和视图,将教你如何使用 C++ 20 中引入的范围库编写算法。您将了解为什么范围库中的视图是有用的,以及延迟求值的一些好处。

第 7 章**内存管理,重点介绍安全高效的内存管理。这包括内存所有权、RAII、智能指针、堆栈内存、动态内存和自定义内存分配器。

第 8 章编译时编程,解释了使用constexprconsteval和类型特征的元编程技术。您还将学习如何使用 C++ 20 概念和新概念库。最后,它提供了元编程用例的实际例子,例如反射。

第 9 章基本实用程序将指导您浏览实用程序库,以及如何使用编译时编程技术从诸如std::optionalstd::anystd::variant等类型中受益。

第 10 章代理对象和延迟求值探讨了如何使用代理对象来执行幕后优化,同时保持干净的语法。此外,还演示了运算符重载的一些创造性用法。

第 11 章并发,涵盖了并发编程的基础,包括并行执行、共享内存、数据竞争和死锁。它还包括对 C++ 线程支持库、原子库和 C++ 内存模型的介绍。

第 12 章协程和延迟生成器,包含协程抽象的一般介绍。您将了解如何使用堆栈和堆在中央处理器上执行普通函数和协程。介绍了 C++ 20 无堆栈协程,您将发现如何使用生成器解决问题。

第 13 章用 coroutines 进行异步编程,介绍了 C++ 20 中使用无堆栈 Coroutines 进行并发编程,并涉及到使用 Boost.Asio 进行异步网络编程的主题

第 14 章并行算法首先展示了编写并行算法的复杂性以及如何衡量它们的性能。然后演示如何使用执行策略在并行环境中利用标准库算法。

充分利用这本书

要充分利用这本书,你需要有 C++ 的基础知识。您最好已经面临过与性能相关的问题,并且正在寻找新的工具和实践,以便为下一次使用性能和 C++ 做好准备。

这本书里有很多代码示例。有些来自现实世界,但大多数都是人为的或大大简化的例子来证明一个概念,而不是为您提供生产就绪的代码。

我已经把所有的代码示例放在按章节划分的源文件中,这样就很容易找到您想要尝试的示例。如果你打开源代码文件,你会注意到我已经用谷歌测试框架编写的测试用例替换了例子中的大部分main()函数。我希望这能帮助你,而不是迷惑你。它允许我为每个示例编写有用的描述,并且它还使得一次运行一章中的所有示例变得更加容易。

为了编译和运行示例,您需要以下内容:

  • 电脑
  • 操作系统(示例已在 Windows、Linux 和 macOS 上得到验证)
  • 一个编译器(我用了 Clang、GCC 和微软 Visual C++)
  • CMake

示例代码提供的 CMake 脚本将下载并安装更多的依赖项,如 Boost、Google Benchmark 和 Google Test。

在写这本书的过程中,我发现使用编译器探索者很有帮助,它可以在https://godbolt.org/找到。编译器资源管理器是一个在线编译器服务,允许您尝试各种编译器和版本。如果你还没试过,那就试试吧!

下载示例代码文件

本书的代码包托管在 GitHubhttps://GitHub . com/PacktPublishing/Cpp-高性能-第二版。如果代码有更新,它将在现有的 GitHub 存储库中更新。

https://github.com/PacktPublishing/上,还有来自 Packt 丰富的图书和视频目录的其他代码包。看看他们!

下载彩色图像

Packt 还提供了一个 PDF 文件,其中包含了本书中使用的截图/图表的彩色图像。可以在这里下载:https://static . packt-cdn . com/downloads/9781839216541 _ color images . pdf

使用的约定

本书通篇使用了许多文本约定。

CodeInText:表示文本中的码字、文件夹名称、文件名、文件扩展名、虚拟网址和用户输入。下面举个例子:“关键字constexpr是在 C++ 11 中引入的。”

代码块设置如下:

#include <iostream>
int main() {
  std::cout << "High Performance C++ \n"; 
} 

当我希望将您的注意力吸引到代码块的特定部分时,相关的行或项目以粗体显示:

#include <iostream>
int main() {
std`::`cout `<<` "High Performance C++ \n"`;`
} 

任何命令行输入或输出都编写如下:

$ clang++ -std=c++ 20 high_performance.cpp
$ ./a.out
$ High Performance C++ 

粗体:表示一个新的术语,一个重要的单词,或者你在屏幕上看到的单词。例如:“填写表格,点击保存按钮。”

警告或重要注意事项是这样出现的。

取得联系

欢迎读者反馈。

一般反馈:如果你对这本书的任何方面有疑问,请在你的信息主题中提到书名,并在[email protected]发送电子邮件至 Packt。

勘误表:虽然我们已经尽了最大的努力来保证内容的准确性,但是错误还是会发生。如果你在这本书里发现了错误,如果你能向我们报告,我们将不胜感激。请访问www.packtpub.com/support/errata,选择您的图书,点击勘误表链接,输入详细信息。

盗版:如果您在互联网上遇到任何形式的我们作品的非法拷贝,如果您能提供我们的位置地址或网站名称,我们将不胜感激。请通过[email protected]联系我们,并提供材料链接。

如果你有兴趣成为一名作者:如果有一个你有专长的话题,你有兴趣写或者投稿一本书,请访问authors.packtpub.com

复习

请留下评论。一旦你阅读并使用了这本书,为什么不在你购买它的网站上留下评论呢?潜在的读者可以看到并使用你的不带偏见的意见来做出购买决定,我们在 Packt 可以了解你对我们产品的看法,我们的作者可以看到你对他们的书的反馈。谢谢大家!

更多关于 Packt 的信息,请访问packt.com