欢迎光临
免费的PDF电子书下载网站

深入应用C++11:代码优化与工程级应用 PDF下载

编辑推荐

资深C++专家、C++11布道师、金山软件资深工程师撰写

深度剖析C++11中*常用新特性,从程序简洁性、性能、代码质量、内存泄露、多线程等多方面给出了代码优化的方法和建议

深入讲解了C++11在线程池开发、流行框架和库的开发、库的封装等各种工程级项目中的应用,包含大量实现源码并开源,可直接使用

 ;

内容简介

这是C++11领域*实用性和工程实践价值的著作。作者是金山软件的资深工程师,有多年一线开发经验,致力于C++11的应用和推广。C++11新特性众多,作者根据自己几年来的研究和实践,甄选出了其中最常用和实用的部分新特性,并结合代码实例讲解了如何通过这些新特性来优化既有的C++代码,这部分内容不仅能让你迅速掌握C++11,而且能充分让你领略C++11的魅力。更为重要的,作者还结合自己的企业实践和开源项目,讲解了如何利用C++11开发各种常用的工程级项目,并且所有项目的代码均开源,具有非常高的使用价值。

全书共16章,分为两个部分
第一部分 C++11改进我们的程序
使用类型推导、lambda、tupe元组等新特性让程序变得更简洁和更现代;
使用右值引用、move语义、emplace_back等新特性改进程序的性能;
使用可变参数模板和类型萃取等新特性消除重复和提高代码质量;

作者简介

祁 宇 资深C++技术专家,致力于C++11的应用、研究和推广。金山软件WPS资深工程师,负责Android服务端开发。精通OOP、OOD、设计模式和重构,主要研究方向为架构设计和业务重构,有丰富的开发和研发管理经验。爱好C++,爱好开源,乐于研究和分享技术,开源了多个项目,在《程序员》杂志发表多篇技术文章。

2013年被评为珠海市优秀青年人才。

深入应用C++11:代码优化与工程级应用 PDF下载

目录

前言
第一篇 C++11改进我们的程序
第1章 使用C++11让程序更简洁、更现代 2
1.1 类型推导 2
1.1.1 auto类型推导 2
1.1.2 decltype关键字 9
1.1.3 返回类型后置语法——auto和decltype的结合使用 14
1.2 模板的细节改进 16
1.2.1 模板的右尖括号 16
1.2.2 模板的别名 18
1.2.3 函数模板的默认模板参数 20
1.3 列表初始化 22
1.3.1 统一的初始化 23
1.3.2 列表初始化的使用细节 25
1.3.3 初始化列表 29
1.3.4 防止类型收窄 32
1.4 基于范围的for循环 34
1.4.1 for循环的新用法 34
1.4.2 基于范围的 for循环的使用细节 36
1.4.3 让基于范围的 for循环支持自定义类型 40
1.5 std::function和bind绑定器 47
1.5.1 可调用对象 47
1.5.2 可调用对象包装器——std::function 49
1.5.3 std::bind绑定器 52
1.6 lambda表达式 56
1.6.1 lambda表达式的概念和基本用法 56
1.6.2 声明式的编程风格,简洁的代码 59
1.6.3 在需要的时间和地点实现闭包,使程序更灵活 60
1.7 tupe元组 61
1.8 总结 63
第2章 使用C++11改进程序性能 64
2.1 右值引用 64
2.1.1 &;&;的特性 65
2.1.2 右值引用优化性能,避免深拷贝 71
2.2 move语义 77
2.3 forward和完美转发 78
2.4 emplace_back减少内存拷贝和移动 81
2.5 unordered container无序容器 83
2.6 总结 85
第3章 使用C++11消除重复,提高代码质量 86
3.1 type_traits——类型萃取 86
3.1.1 基本的type_traits 87
3.1.2 根据条件选择的traits 96
3.1.3 获取可调用对象返回类型的traits 96
3.1.4 根据条件禁用或启用某种或某些类型traits 99
3.2 可变参数模板 103
3.2.1 可变参数模板函数 103
3.2.2 可变参数模板类 107
3.2.3 可变参数模板消除重复代码 111
3.3 可变参数模版和type_taits的综合应用 114
3.3.1 optional的实现 114
3.3.2 惰性求值类lazy的实现 118
3.3.3 dll帮助类 122
3.3.4 lambda链式调用 126
3.3.5 any类的实现 128
3.3.6 function_traits 131
3.3.7 variant的实现 134
3.3.8 ScopeGuard 140
3.3.9 tuple_helper 141
3.4 总结 153
第4章 使用C++11解决内存泄露的问题 155
4.1 shared_ptr共享的智能指针 155
4.1.1 shared_ptr的基本用法 156
4.1.2 使用shared_ptr需要注意的问题 157
4.2 unique_ptr独占的智能指针 159
4.3 weak_ptr弱引用的智能指针 161
4.3.1 weak_ptr基本用法 161
4.3.2 weak_ptr返回this指针 162
4.3.3 weak_ptr解决循环引用问题 163
4.4 通过智能指针管理第三方库分配的内存 164
4.5 总结 166
第5章 使用C++11让多线程开发变得简单 167
5.1 线程 167
5.1.1 线程的创建 167
5.1.2 线程的基本用法 170
5.2 互斥量 171
5.2.1 独占互斥量std::mutex 171
5.2.2 递归互斥量std::recursive_mutex 172
5.2.3 带超时的互斥量std::timed_mutex和std::recursive_timed_mutex 174
5.3 条件变量 175
5.4 原子变量 179
5.5 call_once/once_flag的使用 180
5.6 异步操作 181
5.6.1 获取线程函数返回值的类std::future 181
5.6.2 协助线程赋值的类 std::promise 182
5.6.3 可调用对象的包装类std::package_task 182
5.6.4 std::promise、std::packaged_task和std::future三者之间的关系 183
5.7 线程异步操作函数async 184
5.8 总结 185
第6章 使用C++11中便利的工具 186
6.1 处理日期和时间的chrono库 186
6.1.1 记录时长的duration 186
6.1.2 表示时间点的time point 188
6.1.3 获取系统时钟的clocks 190
6.1.4 计时器timer 191
6.2 数值类型和字符串的相互转换 193
6.3 宽窄字符转换 195
6.4 总结 196
第7章 C++11的其他特性 197
7.1 委托构造函数和继承构造函数 197
7.1.1 委托构造函数 197
7.1.2 继承构造函数 199
7.2 原始的字面量 201
7.3 f?inal和override关键字 203
7.4 内存对齐 204
7.4.1 内存对齐介绍 204
7.4.2 堆内存的内存对齐 207
7.4.3 利用alignas指定内存对齐大小 207
7.4.4 利用alignof和std::alignment_of获取内存对齐大小 208
7.4.5 内存对齐的类型std::aligned_storage 209
7.4.6 std::max_align_t和std::align操作符 211
7.5 C++11新增的便利算法 211
7.6 总结 216
第二篇 C++11工程级应用
第8章 使用C++11改进我们的模式 218
8.1 改进单例模式 218
8.2 改进观察者模式 223
8.3 改进访问者模式 227
8.4 改进命令模式 232
8.5 改进对象池模式 236
8.6 总结 240
第9章 使用C++11开发一个半同步半异步线程池 241
9.1 半同步半异步线程池介绍 241
9.2 线程池实现的关键技术分析 242
9.3 同步队列 243
9.4 线程池 247
9.5 应用实例 250
9.6 总结 251
第10章 使用C++11开发一个轻量级的AOP库 252
10.1 AOP介绍 252
10.2 AOP的简单实现 253
10.3 轻量级的AOP框架的实现 255
10.4 总结 260
第11章 使用C++11开发一个轻量级的IoC容器 261
11.1 IoC容器是什么 261
11.2 IoC创建对象 265
11.3 类型擦除的常用方法 267
11.4 通过Any和闭包来擦除类型 269
11.5 创建依赖的对象 273
11.6 完整的IoC容器 275
11.7 总结 283
第12章 使用C++11开发一个对象的消息总线库 284
12.1 消息总线介绍 284
12.2 消息总线关键技术 284
12.2.1 通用的消息定义 285
12.2.2 消息的注册 285
12.2.3 消息分发 289
12.2.4 消息总线的设计思想 289
12.3 完整的消息总线 292
12.4 应用实例 297
12.5 总结 301
第13章 使用C++11封装sqlite库 302
13.1 sqlite基本用法介绍 303
13.1.1 打开和关闭数据库的函数 304
13.1.2 执行SQL语句的函数 305
13.2 rapidjson基本用法介绍 310
13.2.1 解析json字符串 310
13.2.2 创建json对象 311
13.2.3 对rapidjson的一点扩展 315
13.3 封装sqlite的SmartDB 316
13.3.1 打开和关闭数据库的接口 317
13.3.2 Excecute接口 319
13.3.3 ExecuteScalar接口 323
13.3.4 事务接口 325
13.3.5 ExcecuteTuple接口 325
13.3.6 json接口 327
13.3.7 查询接口 329
13.4 应用实例 332
13.5 总结 335
第14章 使用C++11开发一个linq to objects库 336
14.1 LINQ介绍 336
14.1.1 LINQ语义 336
14.1.2 Linq标准操作符(C#) 337
14.2 C++中的LINQ 339
14.3 LINQ实现的关键技术 340
14.3.1 容器和数组的泛化 341
14.3.2 支持所有的可调用对象 344
14.3.3 链式调用 345
14.4 linq to objects的具体实现 347
14.4.1 一些典型LINQ操作符的实现 347
14.4.2 完整的linq to objects的实现 349
14.5 linq to objects的应用实例 358
14.6 总结 360
第15章 使用C++11开发一个轻量级的并行task库 361
15.1 TBB的基本用法 362
15.1.1 TBB概述 362
15.1.2 TBB并行算法 362
15.1.3 TBB的任务组 365
15.2 PPL的基本用法 365
15.2.1 PPL任务的链式连续执行 365
15.2.2 PPL的任务组 366
15.3 TBB和PPL的选择 367
15.4 轻量级的并行库TaskCpp的需求 367
15.5 TaskCpp的任务 368
15.5.1 task的实现 368
15.5.2 task的延续 369
15.6 TaskCpp任务的组合 372
15.6.1 TaskGroup 372
15.6.2 WhenAll 376
15.6.3 WhenAny 378
15.7 TaskCpp并行算法 381
15.7.1 ParallelForeach:并行对区间元素执行某种操作 381
15.7.2 ParallelInvoke:并行调用 382
15.7.3 ParallelReduce:并行汇聚 383
15.8 总结 386
第16章  使用C++11开发一个简单的通信程序 387
16.1 反应器和主动器模式介绍 387
16.2 asio中的Proactor 391
16.3 asio的基本用法 394
16.3.1 异步接口 395
16.3.2 异步发送 397
16.4 C++11结合asio实现一个简单的服务端程序 399
16.5 C++11结合asio实现一个简单的客户端程序 405
16.6 TCP粘包问题的解决 408
16.7 总结 413
参考文献 414

前沿

Preface 前  言
为什么要写这本书
2011年C++11标准刚发布时,广大C++开发者奔走相告,我也在第一时间看了C++之父Bjarne Stroustrup的C++11 FAQ,虽然只介绍了一部分特性,而且特性的用法介绍也很简短,但给我带来三个震撼:第一个震撼是发现我几乎不认识C++了,这么多新特性,与以前的C++很不同;第二个震撼是很多东西和其他语言类似,比如C#或者Java,感觉很酷;第三个震撼是很潮,比如lambda特性,Java都还没有(那时Java 8还没出来),C++11已经有了。我是一个喜欢研究新技术的人,一下子就被C++那么多新特性吸引住了,连续几天都在看FAQ,完全着迷了,虽然当时有很多地方没看明白,但仍然很兴奋,因为我知道这就是我想要的C++。我马上更新编译器尝鲜,学习新特性。经过一段时间的学习,在对一些主要特性有一定的了解之后,我决定在新项目中使用C++11。用C++11的感觉非常好:有了auto就不用写冗长的类型定义了,有了lambda就不用定义函数对象了,算法也用得更舒服和自然,初始化列表让容器和初始化变得很简便,还有右值引用、智能指针和线程等其他很棒的特性。C++11确实让项目的开发效率提高了很多。
相比C++98/03,C++11做了大幅度的改进,增加了相当多的现代编程语言的特性,使得C++的开发效率有了很大的提高。比如,C++11增加了右值引用,可以避免无谓的复制,从而提高程序性能;C++11增加了可变模板参数,使C++的泛型编程能力更加强大,也大幅消除了重复模板定义;C++11增加了type_traits,可以使我们很方便地在编译期对类型进行计算、查询、判断、转换和选择;C++11中增加的智能指针使我们不用担心内存泄露问题了;C++11中的线程库让我们能很方便地编写可移植的并发程序。除了这些较大的改进之外,C++11还增加了很多其他实用、便利的特性,提高了开发的便利性。对于一个用过C#的开发者来说,学习C++11一定会有一种似曾相识的感觉,比如C++11的auto、for-loop循环、lambda表达式、初始化列表、tuple等分别对应了C#中的var、for-loop循环、lambda表达式、初始化列表、tuple,这些小特性使我们编写C++程序更加简洁和顺手。C++11增加的这些特性使程序编写变得更容易、更简洁、更高效、更安全和更强大,那么我们还有什么理由不去学习这些特性并充分享受这些特性带来的好处呢?
学习和使用C++11不要背着C++的历史包袱,要轻装上阵,把它当作一门新的语言来学习,才能发现它的魅力和学习的乐趣。C++11增加的新特性有一百多项,很多人质疑这会使本已复杂的C++语言变得更加复杂,从而产生一种抗拒心理,其实这是对C++11的误解,C++11并没有变得更复杂,恰恰相反,它在做简化和改进!比如auto和decltype可以用来避免写冗长的类型,bind绑定器让我们不用关注到底是用bind1st还是bind2nd了,lambda表达式让我们可以不必写大量的不易维护的函数对象等。
语言都是在不断进化之中的,只有跟上时代潮流的语言才是充满活力与魅力的语言。C++正是这样一门语言,虽然它已经有三十多年的历史了,但是它还在发展之中。C++14标准已经制定完成,C++17也提上了日程,我相信C++的未来会更加美好,C++开发者的日子也会越来越美好!
作为比较早使用C++11的开发者,我开始在项目中应用C++11的时候,可以查阅的资料还很有限,主要是通过ISO标准(ISO/IEC 14882:2011)、维基百科、MSDN等来学习C++11。然而,这些资料对新特性的介绍比较零散,虽然知道这些新特性的基本用法,但有时候不知道为什么需要这个新特性,在实际项目中该如何应用,或者说最佳实践是什么,这些东西网上可没有,也没有人告诉你,因为当时只有很少的人在尝试用C++11,这些都需要自己不断地去实践、去琢磨,当时多么希望能有一些指导C++11实践的资料啊。在不断实践的过程中,我对C++11的认识加深了,同时,也把应用C++11的一些心得和经验放到我的技术博客上分享出来,还开源了不少C++11的代码,这些代码大多来自于项目实践。技术分享得到了很多认识的或不认识的朋友的鼓励与支持,曾经不止一个人问过我同一个问题,你坚持写博客分享C++11技术是为了什么,有什么好处吗?我想最重要的原因就是C++11让我觉得C++语言是非常有意思和有魅力的语言,不断给人带来惊喜,在窥探到C++11的妙处之后,我很想和更多的人分享,让更多的人领略C++11的魅力。另外一个原因是我的一点梦想,希望C++的世界变得更加美好,C++开发者的日子变得更美好。我希望这些经验能帮助学习C++11的朋友,让他们少走弯路,快速地将C++11应用起来,也希望这些代码能为使用C++的朋友带来便利,解决他们的实际问题。
“独乐乐,与人乐乐,孰乐乎?与少乐乐,与众乐乐,孰乐?”,这是我分享技术和写作此书的初衷。
读者对象
C++开发人员。
C++11新标准发布已经4年了,C++11的使用也越来越普及,这是大势所趋,普通的C++开发者不论是新手还是老手,都有必要学习和应用C++11,C++11强大的特性可以大幅提高生产率,让我们开发项目更加得心应手。
C++11爱好者。
其他语言的开发人员,比如C#或者Java开发人员,想转到C++开发正是时机,因为新标准的很多特性,C#和Java中也有,学起来也并不陌生,可以乘着新标准的“轻舟”学习C++11,事半功倍,正当其时。
如何阅读本书
虽然C++11的目的是为了提高生产率,让C++变得更好用和更强大,但是,这些新特性毕竟很多,面对这么多特性,初学者可能会茫然无措,找不到头绪。如果对着这些特性一一去查看标准,不仅枯燥乏味,还丧失了学习的乐趣,即使知道了新特性的基本用法,却不知道如何应用到实际开发中。针对这两个问题,本书试图另辟蹊径来解决。本书的前半部分将从另外一个角度去介绍这些新特性,不追求大而全,将重点放在一些常用的C++11特性上,有侧重地从另外一个角度将这些特性分门别类,即从利用这些新特性如何去改进我们现有程序的角度介绍。这种方式一来可以让读者掌握这些新特性的用法;二来还可以让读者知道这些特性是如何改进现有程序的,从而能更深刻地领悟C++11的新特性。
如果说本书的前半部分贴近实战,那么本书后半部分的工程级应用就是真正的实战。后半部分将通过丰富的开发案例来介绍如何用C++11去开发项目,因为只有在实战中才能学到真东西。后半部分实战案例涉及面比较广,是笔者近年来使用C++11的经验与心得的总结。这些实践经验是针对实际开发过程中遇到的问题来选取的,它们的价值不仅可以作为C++11实践的指导,还可以直接在实际开发中应用(本书开发案例源码遵循LGPL开源协议),相信这些实战案例一定能给读者带来更深入的思考。
通过学习本书基础知识与实战案例,相信读者一定能掌握大部分C++11新特性,并能应用于自己的实际开发中,充分享受C++11带来的好处。
C++之父BjarneStroustrup曾说过:C++11看起来像一门新的语言。这个说法是否夸张,读者不妨看完本书之后再来回味这句话。
本书示例代码需要支持C++11的编译器:
Windows:Visual Studio 2013。
Linux:GCC 4.8+或者Clang 3.4。
由于少数代码用到了boost库,还需要编译boost 1.53或最新的boost库。
勘误和支持
除封面署名外,张轶(木头云)参与了第1章大部分内容和7.4节的整理,还负责了本书大部分的审稿工作。由于笔者的水平有限,书中错漏之处在所难免,敬请读者批评指正,如有更多宝贵意见请发到我的邮箱,同时,我们也会把本书的勘误集中公布在我的博客上。本书中有少数内容来自en.cppreference.com、MSDN,以及一些网络博客,虽然大部分都注明了出处,但也可能存在疏漏,如果有些内容引用了但没注明出处,请通过邮箱与我联系。
书中的全部源文件除可以从华章网站下载外,还可以从github上下载,同时我也会将相应的功能更新及时更正出来。
致谢
首先感谢你选择本书,相信本书会成为你学习和应用C++11的良师益友。
感谢C++之父Bjarne Stroustrup和C++标准委员会,正是他们推动着C++不断改进和完善,才使C++变得更有魅力。
还要感谢一些热心朋友的支持,其中,史建鑫、于洋子、吴楚元、胡宾朔、钟郭福、林曦和翟懿奎审阅了部分章节的内容,并提出了宝贵的意见;还要感谢刘威提供了一些论文资料。
感谢机械工业出版社华章公司的两位编辑杨福川和姜影,在这一年多的时间里始终支持我的写作,他们的帮助与鼓励引导我能顺利完成全部书稿。
接下来我要感谢我的家人:感谢我的父母和妻子,没有他们承担所有的家务和照顾孩子,我不可能完成此书;感谢弟弟和弟妹对我的鼓励与支持。还要对一岁多的女儿说声抱歉,为了完成本书,已经牺牲了很多陪女儿玩耍的时间,记得女儿经常跑到我写作的书房拉着我的手往外走,边走边说:“爸爸一起玩一下”。在这要对我的家人说声抱歉,在这一年的时间里,由于专注于写作,对他们一直疏于关心和照顾。
谨以此书献给我最亲爱的家人,以及众多热爱C++11的朋友们!

祁宇(qicosmos)

深入应用C++11:代码优化与工程级应用 pdf下载声明

本pdf资料下载仅供个人学习和研究使用,不能用于商业用途,请在下载后24小时内删除。如果喜欢,请购买正版

pdf下载地址

版权归出版社和作者所有,下载链接已删除。如果喜欢,请购买正版!

链接地址:深入应用C++11:代码优化与工程级应用