新书《深入应用C++11:代码优化与工程级应用》出版,感谢支持

  经过一年的编写,这本书终于和大家见面了, 已经由机械工业出版社出版,希望本书能给学习C++尤其是C++11的朋友们更多的帮助。

关于C++11

  在StackOverflow的最近一次世界性调查中,C++11在所有的编程语言中排名第二, C++11受到程序员的追捧是毫不意外的,因为它就像C++之父Bjarne Stroustrup说的:它看起来就像一门新的语言。C++11新增加了相当多的现代编程语言的特性,相比C++98/03,它在生产力、安全性、性能和易用性上都有了大幅提高。比如auto和decltype让我们从书写冗长的类型和繁琐的类型推断中解脱出来,智能指针让我们再也不用担心内存泄漏的问题,右值引用避免了无谓的临时对象拷贝,type_traits和可以变模板参数让我们可以更方便地写更加泛化的代码……这些还只是新增的一百多项新特性中的一小部分而已。C++14的标准在2014年的时候已经确定,而C++17标准正在制定当中,可以预见的未来,C++的发展会越来越好,C++的应用会越来越广泛,也会更受广大开发者地欢迎。

本书介绍

  本书的内容来源于C++11项目实践,写作此书的目的是为了和广大读者分享学习和应用C++11的经验和乐趣。本书分为两篇,第一篇主要是介绍一些常用的C++11特性,介绍这些特性是如何优化C++11以前的一些代码的,读者可以从中更深刻地领悟这些新特性;第二篇主要是一些实际开发中的典型应用案例,通过这些案例读者可以看到C++11的这些新特性是如何综合运用于实际开发中的,具有实践的指导作用。相信本书会成为读者学习和应用C++11的良师益友。

主要内容

  主要介绍了C++11中最常用新特性,从程序简洁性、性能、代码质量、内存泄露、多线程等多方面给出了代码优化的方法和建议。 深入讲解了C++11在线程池开发、流行框架和库(如AOP、IOC和Linq)的开发、库的封装等各种工程级项目中的应用,包含大量实现源码。具体的目录如下(展开下面的节点即可看完整目录):

前言
第一篇 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 final和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 

总结

  C++11增加的新特性有一百多项,很多人质疑这会使本已复杂的C++语言变得更加复杂,从而产生一种抗拒心理,其实这是对C++11的误解,C++11并没有变得更复杂,恰恰相反,它在做简化和改进!比如auto和decltype可以用来避免写冗长的类型,bind绑定器让我们不用关注到底是用bind1st还是bind2nd了,lambda表达式让我们可以不必写大量的不易维护的函数对象等。   

  语言都是在不断进化之中的,只有跟上时代潮流的语言才是充满活力与魅力的语言。C++正是这样一门语言,虽然它已经有三十多年的历史了,但是它还在发展之中。C++14标准已经制定完成,C++17也提上了日程,我相信C++的未来会更加美好,C++开发者的日子也会越来越美好!

感谢

本书现在在各大书店已经有售:

京东发售链接

china-pub发售链接

亚马逊发售链接

天猫商城发售链接

为感谢大家支持,会送书给园友。
在回复的第4页第4个留言的朋友将获得签名书一本。第6页第6个留言的朋友将获得签名书一本。

时间: 2024-10-11 11:51:23

新书《深入应用C++11:代码优化与工程级应用》出版,感谢支持的相关文章

《深入应用C++11:代码优化与工程级应用》勘误表

<深入应用C++11:代码优化与工程级应用>勘误表,会不断更新,欢迎读者留言或发邮件([email protected])给我提出宝贵意见. 1.第7.3节目录final和override关键字应该改为标识符: 这个问题由网友“李奥霍克”和“Cu2S”指出在此表示感谢. 2.page 156, 倒数第三行代码newint应该为new int 3.page 177,倒数第三行语句unique_lock多写了一个,应该去掉一个. 上面这两个问题是读者玄龠指出的,在此表示感谢. 也欢迎更多的读者来指

阅读《深入应用C++11:代码优化与工程级应用》

虽然一直是写C++的,但是却对C++11了解的不是太多,于是从图书馆借了本书来看 这本书分两大部分: 一.C++11的新特性讲解 二.工程级代码中C++11的应用 这样的安排很合理,第一部分把新特性讲解的很透彻,第二部分通过几个实例讲解了C++11在实际工程中的应用. 总之这本书挺好的,推荐想学习C++11的人看. 原文地址:https://www.cnblogs.com/lit10050528/p/9080517.html

Oracle GoldenGate (ogg) 11.2.1.0.20 是最后一个支持oracle db 10g的 ogg版本

参考原文: Oracle GoldenGate 11.2.1.0.22 Patch Set Availability (Doc ID 1669160.1) 该文章不做翻译,仅仅摘录其中有价值的信息,如下: Alert! OGG 11.2.1.0.22 is -not- available for Oracle Database 10g. Oracle GoldenGate 11.2.1.0.20 is the Terminal Release for support of Oracle Data

第11回 前端工程的哲学和爱

朋友们.伙伴们: 大家好! 我的写作停了几天,可是我的内心的感悟却从来都没有停步过.你以为我胆怯了吗,以为我疲惫了吗,不,不,从来都没有.我在用不同的生活节奏来酝酿内心的思想和文字.只有当我们的软件行业各个方面达到甚至超过了欧美.印度的水平,我的博客才会转型,我的博文才会成为历史.而今天,我们依然要用文字来交流.用文字来战斗! 最近些天,我在思考网站前端工程的事情. 首先我要为前端工程师的职业歌唱,好像这是一句套话,不,不.一切职业都是值得尊敬的,但现实不是所有的职业都激发出我们无限的热情和歌唱

在VC工程中添加多语言支持[转]

随着贸易国际化,在软件开发过程中,常会碰到需在现有中文版软件加入多语言支持的情况.由于不同语言版本间的差别通常仅是软件操作界面的不同,为实现多语言支持,使用纯资源DLL是一个不错的解决之道.所谓纯资源DLL是指只包含资源的DLL,譬如:快捷键.对话框.字符串.菜单.工具条.位图.图标.版本信息等等. 具体做法是:利用VC可视化编辑环境为每种语言制作一套资源ID一一对应的资源集并编译生成DLL文件.应用程序初始化时按预设的语言设置选择合适的资源DLL调入,使用资源时依据资源ID进行访问,这样即可实

iOS在支持arc的工程中,导入不支持arc的第三方的插件

首先将插件导入到工程中,然后点击工程名,在targets下面找到相应的条目,然后选择build phares,打开第二行compile sourses,然后找到不支持arc的.m文件,在后边添加上"-fno-objc-arc"即可.

双11大考 POLARDB分钟级弹性让企业轻松扩展

POLARDB优势解读系列文章之--分钟级弹性 无处不在的脉冲计算阿里有双11,中国有春运,高考后有分数出来的那天,歌迷心中有周杰伦演唱会门票在线开售之时....有人的地方就有江湖,有人的地方也有脉冲计算,这些热点事件背后都需要大量的计算资源给予支撑,而这些突然急需的计算资源就像脉冲一样,急迫而猛烈,我们称之为脉冲计算.不仅ECS服务器,数据库也需要应对这些突如其来的脉冲波动,才能保证整个系统的平滑稳定. 存储与计算分离我们知道POLARDB一个最大的特点是存储与计算分离,所谓分离就是计算节点(

新书《编写可测试的JavaScript代码 》出版,感谢支持

本书介绍 JavaScript专业开发人员必须具备的一个技能是能够编写可测试的代码.不管是创建新应用程序,还是重写遗留代码,本书都将向你展示如何为客户端和服务器编写和维护可测试的JavaScript代码. 从减少代码复杂性的方法,到单元测试.代码覆盖率.调试.以及自动化,您将全面学到如何编写让你和你同事能够轻松修复和维护的JavaScript代码.测试JavaScript代码是一个复杂的过程.本书将在很大程度上帮你简化该过程. 目标读者 本书主要目标受众是那些想成为JavaScript专业开发人

【C++11学习笔记】类型判断的type_traits学习

一.简单的type_traits 我理解的type_traits是利用C++模板特性和static.enum特性定义编译器常量,例如 //std::integral_constant源码 typelate<class T, T v> struct integral_constant { static const T value = v; typedef T value_type; typedef integral_constant<T, v> type; operator valu