• C++高性能编程
21年品牌 40万+商家 超1.5亿件商品

C++高性能编程

正版保障 假一赔十 可开发票

66.36 4.5折 148 全新

库存19件

广东广州
认证卖家担保交易快速发货售后保障

作者[瑞典]比约恩 安德里斯特(Bj?rn Andrist),[瑞典]维克托 塞尔(Viktor Sehr)

出版社中国电力出版社

ISBN9787519883058

出版时间2024-01

装帧平装

开本16开

定价148元

货号29684401

上书时间2024-11-13

兴文书店

三年老店
已实名 已认证 进店 收藏店铺

   商品详情   

品相描述:全新
商品描述
前言

前言现今的C  语言为开发者提供了“编写富有表现力和健壮性代码的能力,同时几乎可在所有硬件平台上运行,并满足关键性能要求”。这使得C  成为一门独特的语言。在过去几年中,C  已经演变为一种现代化语言,使用更加有趣,并具有更实用的默认功能。本书的目标是,为你奠定编写高效应用程序坚实的基础,并深入了解现代C  中实现库的策略。与讲述C  的历史相比,我更倾向于以实践为导向的形式介绍当前C  的运行方式,包括其组成部分以及在C  17 和C  20 中引入的特性。考虑到C  20 中新增的特性,在编写本书时,我引入了能够与本书内容和重点相吻合的新特性。新特性更多的是关于概念的介绍,包含了少量的最佳实践和经过验证的解决方案。在本书出版时,编译器对书中介绍的一些C  20 特性的支持仍处于试验阶段。如果在出版日期阅读,可能需要一段时间才会被编译器完全支持。此外,本书的许多章节难度跨度较大。它们从绝对的基础知识开始,一直延伸到高级主题,如自定义内存分配器。你可以随时跳过某一节,以后再来学习。除了前三章之外,大多数章节都可以独立阅读。我们主要的技术审校者Timur Doumler 对本书的新版本影响深远。他的热情和积极的反馈让本书第一版的部分内容得以重新修订,呈现出更彻底、更深入地讲解。C  20 的新特性自然地融入各章,Timur 也是重要的贡献者。此外,Arthur O'Dwyer、Marius Bancila 和Lewis Baker 也审校了该书的部分内容。有如此多出色的审校者们参与到这个项目中,着实是件令人高兴的事情。希望你喜欢这个新版本,就像我享受编写它一样。本书的目标读者本书期望读者具备基本的C  和计算机体系结构知识,并对提升自身专业技能真正感兴趣。希望阅读本书后,能对如何在性能和语法上改进自己的C  代码有更深入的认识。此外,希望你在阅读本书时,能够有一些顿悟时刻。本书涵盖的内容第1 章,C  概述,介绍了C  的重要特性,如零成本抽象、值语义、常量正确性、显式所有权和错误处理。同时,本章还探讨了C  的缺点。第2 章,C  必b备技能,描述了使用auto 进行自动类型推导、lambda 函数、move 语义和错误处理。第3 章,分析和度量性能,将教你如何使用大O 符号来分析算法的复杂度,以及如何对代码进行剖析以找到性能瓶颈,并介绍了使用Google Benchmark 进行性能测试的方法。第4 章,数据结构,阐述了构建高效数据结构的重要性,以便快速访问数据。同时介绍了标准库中的容器,如std::vector,std::list、std::unordered_map 和std::priority_queue。本章最后还演示了如何使用并行数组。第5 章,算法,介绍了标准库中最重要的算法。将学习如何使用迭代器(Iterator)和范围(Ranges)处理数据,以及如何实现自己的通用算法。第6 章,范围和视图,将学习如何使用C  20 中引入的Ranges 库来组织算法,以及Ranges 库视图的实用性以及惰性求值的好处。第7 章,内存管理,重点关注安全而高效的内存管理。内容包括内存所有权、RAII、智能指针、堆栈内存、动态内存和自定义内存分配器。第8 章,编译时编程,介绍使用constexpr、consteval 和类型萃取等元编程技术。你将学习如何利用C  20 的概念和Concepts 库,以及元编程的实际应用,如反射。第9 章,Utilities 基础,引导你了解Utilities 库,如何利用编程技术从std::optional、std::any和std::variant 等类型中受益。第10 章,代理对象和惰性求值,探讨如何在保留清晰语法的同时,使用代理对象对内部优化,以及操作符重载的一些创造性用法。第11 章,并发,涵盖并发编程的基础知识,包括并行执行、共享内存、数据竞争和死锁。介绍了C  线程支持库、Atomic 库和C  内存模型。第12 章,协程和惰性生成器,提供对协程抽象的综合介绍。你将学习如何在CPU 上执行普通函数和协程,以及C  20 的无栈协程和生成器的用法。第13 章,用协程进行异步编程,介绍使用C  20 的无栈协程进行并发编程,并讨论使用Boost.Asio 进行异步网络编程的话题。第14 章,并行算法,展示编写并行算法的复杂度及如何度量其性能,以及如何利用标准库算法和执行策略在并行环境中进行并行计算。阅读本书的必要准备为了从本书中获得最大的收益,你确实需要具备基本的C  知识。如果你已经遇到与性能相关的问题,并正在寻找新的工具和实践方法来优化性能,那么你将能够更好地理解和应用本书中的内容,并从中获得更大的收获。本书包含大量代码示例,其中一些来自真实项目,但大多数是经过改造或大幅简化的示例,用于说明概念,并不会直接提供可在生产环境中运行的代码。我已经按照章节将所有代码示例划分并放置在相应的源文件中,这样做可以方便快速地找到实验案例。此外,我还使用了Google Test 框架编写了自动化测试用例,以取代示例中的大部分main()函数。我希望这些改变对你有所帮助,而不会增加困惑。这样做有助于我为每个例子提供有意义的描述,并使大家能够更便捷地一次性运行每章中的所有例子。为了编译和运行这些示例,你将需要:● 一台电脑。● 操作系统(这些示例已经在Windows、Linux 和macOS 上得到了验证)。● 编译器(我使用的是Clang、GCC 和Microsoft Visual C  )。● CMake。提供的示例代码中的CMake 脚本将下载并安装其他依赖项,如Boost、Google Benchmark和Google Test。在撰写本书的过程中,我发现使用Compiler Explorer(https://godbolt.org/)非常有帮助。它是一个在线编译器,可以在此尝试不同版本的编译器。如果你尚未尝试过这些工具,我强烈建议你去体验一下!它们将为你带来许多便利和优势。下载示例代码文件本书代码托管在GitHub 上,位于https://github.com/ PacktPublishing/Cpp-High-Performance-Second-Edition。代码会在现有GitHub 代码库中持续更新。你可在https://github.com/PacktPublishing/找到其他由Packt 出版社出版的书籍和视频中的代码。下载彩色插图本书还提供了一个包含本书中使用的屏幕截图和图表的彩色图片的PDF 文件。可在这里下载该文件:https://static.packt-cdn.com/ downloads/9781839216541_ColorImages.pdf。文本格式约定本书使用以下文本约定。CodeInText:表示文本、文件夹名称、文件名、文件扩展名、假的URL 和用户输入。如:“关键字constexpr 是在C  11 中引入的。”以下是代码块的约定:#include int main() {std::cout << "High Performance C  \n";}本书在强调特定代码部分时会使用粗体来标记相关的行或项:#include int main() {std::cout << "High Performance C  \n";}命令行的输入输出格式如下:$ clang   -std=c  20 high_performance.cpp$ ./a.out$ High Performance C  粗体字用于表示术语、重要词汇或在屏幕上可见的文字。例如:“填写表格并点击保存按钮”。警告或重要说明会以这样的方式呈现。联系方式我们非常欢迎读者的反馈。一般反馈:如果你对本书的任何方面有疑问,请在邮件主题中提及书名,并发送邮件至Packt(customercare@packtpub.com)。我们期待您的来信。勘误:尽管我们已尽力确保内容的准确性,但错误可能仍会出现。如果你在本书中发现任何错误,我们将非常感激。请访问 www.packtpub.com/support/errata,选择本书,并点击“勘误提交表格”链接,并输入详细信息。盗版:如果你在互联网上发现任何非法拷贝我们作品的形式,请向我们提供网址或网站名称,我们将非常感激。请通过copyright@packt.com 与我们联系,并提供相关材料的链接。如果愿意成为作者:如果你对某个专题有深入了解,并且对撰写书籍或投稿感兴趣,请访问 authors.packtpub.com。我们期待与您合作。撰写书评我们期待你的宝贵评论。在阅读并使用本书后,请在购买本书的网站上留下评论。供其他潜在读者参考你的意见,同时我们也可以了解你对Packt 产品的看法,而作者也能够看到你对书籍的反馈。非常感谢你的支持!如需了解更多关于Packt 的信息,请访问 packt.com。



目录
目录

前言
第1 章 C++概述  1
1.1 为什么是C++  1
1.1.1 零成本抽象 · 1
1.1.2 可移植性 · 4
1.2 与其他语言对比  4
1.2.1 竞争语言和性能 · 5
1.2.2 与性能无关的C++语言特性 · 7
1.2.3 C++的局限性 12
1.3 本书使用的库和编译器  13
1.4 总结  13
第2 章 C++推荐技能 · 14
2.1 用auto 关键字进行自动类型推断  14
2.1.1 在函数签名中使用auto 14
2.1.2 对变量使用auto 16
2.1.3 指针的常量传播 18
2.2 移动语义  19
2.2.1 拷贝构造函数,交换与移动 20
2.2.2 资源获取与五法则 22
2.2.3 具名变量和右值 25
2.2.4 默认移动语义和零法则 27
2.2.5 将&&修饰符应用于类成员函数 ·32
2.2.6 当拷贝被省略时,无论如何都不要移动 32
2.2.7 适时使用值传递 33
2.3 设计带有错误处理的接口  35
2.3.1 契约 36
2.3.2 错误处理  39
2.4 函数对象和lambda 表达式  46
2.4.1 C++lambda 的基本语法  46
2.4.2 捕获子句  47
2.4.3 为lambda 表达式分配C 函数指针 · 53
2.4.4 Lambda 类型 · 54
2.4.5 lambda 表达式和std::function · 54
2.4.6 泛型lambda  58
2.5 总结  60
第3 章 分析和度量性能 · 61
3.1 渐进复杂度和大O 符号  61
3.1.1 增长率  66
3.1.2 均摊时间复杂度  67
3.2 度量什么?该如何度量?  69
3.2.1 性能特征  71
3.2.2 运行时间的提升  71
3.2.3 性能计数器  72
3.2.4 很好实践:性能测试  73
3.3 了解代码和热点  74
3.3.1 插桩型剖析器  75
3.3.2 采样型剖析器  77
3.4 微基准测试  79
3.4.1 阿姆达尔定律  80
3.4.2 微基准测试的隐患  81
3.4.3 微基准测试实例  81
3.5 总结  87
第4 章 数据结构 · 88
4.1 计算机内存的特性  88
4.2 标准库容器  92
4.2.1 序列式容器  92
4.2.2 关联式容器  96
4.2.3 容器适配器 ·100
4.3 使用视图  103
4.4 性能方面的考量  106
4.4.1 在复杂度与开销间寻求平衡 · 106
4.4.2 了解并使用适当的API 函数  107
4.5 并行数组  108
4.6 总结  115
第5 章 算法  116
5.1 标准库算法概述  116
5.1.1 标准库算法的演进 · 116
5.1.2 解决日常问题 · 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 标准算法的特点  129
5.4 算法不会改变容器大小  129
5.4.1 有输出的算法需要自己分配数据 · 130
5.4.2 算法默认使用operator==()和operator<()  131
5.4.3 使用projection 的约束算法  132
5.4.4 算法要求move 不能抛出异常  133
5.4.5 算法具有复杂度保证 · 133
5.4.6 算法的性能与C 语言库中的等价函数一样好  134
5.5 编写和使用泛型算法  135
5.5.1 非泛型算法 · 135
5.5.2 泛型算法 · 136
5.5.3 可被泛型算法使用的数据结构 · 137
5.6 很好实践  139
5.6.1 使用约束算法 · 139
5.6.2 只对需要检索的数据进行排序 · 139
5.6.3 使用标准算法而非原始for 循环  142
5.6.4 避免容器拷贝 · 148
5.7 总结  149
第6 章 范围和视图  150
6.1 Ranges 库的动机 · 150
6.2 理解Ranges 库中的视图 · 153
6.2.1 视图是可组合的 ·154
6.2.2 范围视图带有范围适配器 ·155
6.2.3 视图是具有复杂度保证的非具权范围 ·156
6.2.4 视图不改变底层容器 ·157
6.2.5 视图可以被具体化为容器 ·157
6.2.6 视图是惰性求值的 ·158
6.3 标准库中的视图  160
6.3.1 范围视图 ·160
6.3.2 生成视图 ·160
6.3.3 转换视图 ·160
6.3.4 再谈std::string_view 与std::span 162
6.4 Ranges 库的未来 · 164
6.5 总结  164
第7 章 内存管理  165
7.1 计算机内存  165
7.1.1 虚拟地址空间 ·165
7.1.2 内存页 ·166
7.1.3 抖动 ·167
7.2 进程内存  167
7.2.1 栈内存 ·168
7.2.2 堆内存 ·171
7.3 内存中的对象  172
7.3.1 创建与销毁对象 ·172
7.3.2 内存对齐 ·176
7.3.3 内存补齐 ·179
7.4 内存所有权  182
7.4.1 隐式处理资源 ·183
7.4.2 容器 ·185
7.4.3 智能指针 ·185
7.5 小对象优化  188
7.6 自定义内存管理  191
7.6.1 创建arena  192
7.6.2 自定义内存分配器 · 196
7.6.3 使用多态内存分配器 · 201
7.6.4 实现自定义内存资源 · 205
7.7 总结  207
第8 章 编译时编程  208
8.1 模板元编程介绍  208
8.2 创建模板  209
8.3 使用整数作为模板参数  211
8.4 提供模板的特化  212
8.5 编译器如何处理模板函数  212
8.6 缩写函数模板  213
8.7 使用decltype 接收变量类型  214
8.8 类型萃取  215
8.8.1 类型萃取的类别 · 215
8.8.2 类型萃取的使用 · 216
8.9 常量表达式的使用  217
8.9.1 运行时环境中的constexpr 函数  218
8.9.2 使用consteval 声明即时函数  219
8.9.3 编译时多态与运行时多态 · 222
8.9.4 示例:使用if constexpr 的泛型取模函数  223
8.10 编译时检查程序错误  224
8.10.1 利用assert 在运行时触发错误  224
8.10.2 利用static_assert 在编译时触发错误 · 225
8.11 约束与概念  226
8.11.1 Point2D 模板,无约束版 · 226
8.11.2 泛型接口与不友好的报错信息  227
8.11.3 约束和概念的语法  229
8.11.4 标准库中的概念  234
8.12 元编程实例  235
8.12.1 示例1:创建通用的安全强制转换函数  235
8.12.2 示例2:在编译时对字符串进行哈希处理  238
8.13 总结 · 245
第9 章 Utilities 基础 · 246
9.1 用std::optional 表示可选值· 246
9.1.1 可选的返回值 ·247
9.1.2 可选的成员变量 ·248
9.1.3 避免在枚举中使用空状态 ·248
9.1.4 std::optional 的排序与比较 249
9.2 固定大小的异质集合  250
9.2.1 std::pair 250
9.2.2 std::tuple 251
9.2.3 访问元组中的成员 ·252
9.2.4 遍历std::tuple 的元素 ·253
9.2.5 元组展开 ·254
9.2.6 为元组实现其他算法 ·255
9.2.7 元组元素访问 ·256
9.2.8 结构化绑定 ·257
9.3 可变参数模板  258
9.4 可动态调整大小的异质集合  261
9.4.1 std::variant 262
9.4.2 std::variant 的异常安全性 264
9.4.3 访问variant ·265
9.5 使用了variant 的异质集合 · 266
9.5.1 访问variant 容器中的值 267
9.5.2 全局函数std::get() 268
9.6 实际案例  269
9.6.1 示例1:投影与比较运算符 269
9.6.2 示例2:反射 270
9.7 总结  273
第10 章 代理对象和惰性求值 · 274
10.1 惰性求值和代理对象简介· 274
10.1.1 惰性求值与急切计值 274
10.1.2 代理对象 275
10.2 避免使用代理对象构建对象  276
10.2.1 使用代理比较连接的字符串  276
10.2.2 实现代理  277
10.2.3 右值修饰符  278
10.2.4 存储拼接好的代理对象  279
10.2.5 性能评估  279
10.3 延迟sqrt 计算  280
10.3.1 一个简单的二维向量类  280
10.3.2 示例背后的数学概念  281
10.3.3 实现LengthProxy · 283
10.3.4 用LengthProxy 比较长度  285
10.3.5 用LengthProxy 计算长度  286
10.3.6 性能评估  287
10.4 探索运算符重载和代理对象  289
10.5 总结  291
第11 章 并发 · 292
11.1 了解并发的基本概念  292
11.2 是什么让并发编程变得困难?  293
11.3 并发和并行  293
11.3.1 时间切片  294
11.3.2 共享内存  295
11.3.3 数据竞争  296
11.3.4 互斥锁  298
11.3.5 死锁  299
11.3.6 同步任务与异步任务  299
11.4 C++中的并发编程 · 300
11.4.1 线程支持库  301
11.4.2 C++20 中其他的同步原语  315
11.4.3 C++中的原子操作  326
11.4.4 C++内存模型  335
11.5 无锁编程  339
11.6 性能指南  341
11.6.1 避免竞争  341
11.6.2 避免阻塞操作  342
11.6.3 线程/CPU 核数 ·342
11.6.4 线程优先级 343
11.6.5 线程亲和性 343
11.6.6 伪共享 344
11.7 总结 · 345
第12 章 协程和惰性生成器 · 346
12.1 几个引人入胜的例子 · 347
12.2 协程抽象 · 348
12.2.1 子例程和协程 349
12.2.2 在CPU 上运行子例程和协程 350
12.2.3 无栈协程和有栈协程 358
12.2.4 目前为止所学的内容 360
12.3 C++中的协程 · 360
12.3.1 标准C++中协程的涵盖内容 361
12.3.2 C++函数成为协程的关键是什么? ·361
12.3.3 一个最简但完整的示例 363
12.3.4 分配协程状态 368
12.3.5 避免悬空引用 370
12.3.6 错误处理 375
12.3.7 自定义点 375
12.4 生成器 · 376
12.4.1 实现生成器 376
12.4.2 使用Generator 类 ·380
12.4.3 在实际工作中使用生成器 387
12.5 性能 · 395
12.6 总结 · 395
第13 章 用协程进行异步编程 · 396
13.1 再谈可等待类型 · 396
13.2 实现一个基本任务类型 · 398
13.2.1 处理返回值和异常 401
13.2.2 恢复等待中的协程 402
13.2.3 支持void Task 404
13.2.4 同步等待任务完成 406
13.2.5 使用sync_wait()测试异步任务  411
13.3 封装基于回调的API · 412
13.4 使用Boost.Asio 实现的并发服务器  416
13.4.1 实现服务器  416
13.4.2 运行并连接服务器  418
13.4.3 在服务器示例中实现的(以及未实现的)功能 419
13.5 总结  420
第14 章 并行算法 · 421
14.1 并行的重要性  421
14.2 并行算法  421
14.2.1 度量并行算法  422
14.2.2 回顾阿姆达尔定律  423
14.2.3 实现并行std::transform() · 424
14.2.4 并行化std::count_if() 

—  没有更多了  —

以下为对购买帮助不大的评价

此功能需要访问孔网APP才能使用
暂时不用
打开孔网APP