编辑推荐

  

  资深C++专家、C++11布道师、金山软件资深工程师撰写
  深度剖析C++11中常用新特性,从程序简洁性、性能、代码质量、内存泄露、多线程等多方面给出了代码优化的方法和建议
  深入讲解了C++11在线程池开发、流行框架和库的开发、库的封装等各种工程级项目中的应用,包含大量实现源码并开源,可直接使用
  在StackOverflow的最近一次世界性调查中,C++11在所有的编程语言中排名第二,C++11受到程序员的追捧是毫不意外的,因为它就像C++之父BjarneStroustrup说的:它看起来就像一门新的语言。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:代码优化与工程级应用》会成为读者学习和应用C++11的良师益友。

内容简介

  

  资深C++专家、C++11布道师、金山软件资深工程师撰写
  深度剖析C++11中常用新特性,从程序简洁性、性能、代码质量、内存泄露、多线程等多方面给出了代码优化的方法和建议
  深入讲解了C++11在线程池开发、流行框架和库的开发、库的封装等各种工程级项目中的应用,包含大量实现源码并开源,可直接使用
  在StackOverflow的最近一次世界性调查中,C++11在所有的编程语言中第二,C++11受到程序员的追捧是毫不意外的,因为它就像C++之父BjarneStroustrup说的:它看起来就像一门新的语言。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:代码优化与工程级应用》会成为读者学习和应用C++11的良师益友。
  
  更多精彩,点击进入品牌店查阅>>

作者简介

  这是C++11领域实用性和工程实践价值的著作。作者是金山软件的资深工程师,有多年一线开发经验,致力于C++11的应用和推广。C++11新特性众多,作者根据自己几年来的研究和实践,甄选出了其中最常用和实用的部分新特性,并结合代码实例讲解了如何通过这些新特性来优化既有的C++代码,这部分内容不仅能让你迅速掌握C++11,而且能充分让你领略C++11的魅力。更为重要的,作者还结合自己的企业实践和开源项目,讲解了如何利用C++11开发各种常用的工程级项目,并且所有项目的代码均开源,具有非常高的使用价值。
  《华章原创精品·深入应用C++11:代码优化与工程级应用》共16章,分为两个部分
  部分C++11改进我们的程序
  使用类型推导、lambda、tupe元组等新特性让程序变得更简洁和更现代;
  使用右值引用、move语义、emplace_back等新特性改进程序的性能;
  使用可变参数模板和类型萃取等新特性消除重复和提高代码质量;
  使用智能指针相关新特性解决内存泄露问题;
  使用线程、互斥量、异步操作等新特性让多线程开发更简单;
  ……
  第二部分C++11工程实践
  用C++11改进各种常用的设计模式,如单例模式、观察者模式、访问者模式,等等;
  用C++11开发一个半同步半异步线程池、消息总线库和通信程序;
  用C++11开发轻量级AOP库、轻量级IoC容器、轻量级的并行task库
  用C++11封装SQLite库和开发linqtoobjects库;
  ……

精彩书评

  

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

目录

前言
第一篇C++11改进我们的程序
第1章使用C++11让程序更简洁、更现代,
1.1类型推导
1.1.1auto类型推导
1.1.2decltype关键字
1.1.3返回类型后置语法——auto和decltype的结合使用
1.2模板的细节改进
1.2.1模板的右尖括号
1.2.2模板的别名
1.2.3函数模板的默认模板参数
1.3列表初始化
1.3.1统一的初始化
1.3.2列表初始化的使用细节
1.3.3初始化列表
1.3.4防止类型收窄
1.4基于范围的for循环
1.4.1for循环的新用法
1.4.2基于范围的for循环的使用细节
1.4.3让基于范围的for循环支持自定义类型
1.5std::function和bind绑定器
1.5.1可调用对象
1.5.2可调用对象包装器——std::function
1.5.3std::bind绑定器
1.6lambda表达式
1.6.1lambda表达式的概念和基本用法
1.6.2声明式的编程风格,简洁的代码
1.6.3在需要的时间和地点实现闭包,使程序更灵活
1.7tupe元组
1.8总结
第2章使用C++11改进程序性能
2.1右值引用
2.1.1&&的特性
2.1.2右值引用优化性能,避免深拷贝
2.2move语义
2.3forward和完美转发
2.4emplace_back减少内存拷贝和移动
2.5unorderedcontainer无序容器
2.6总结
第3章使用C++11消除重复,提高代码质量
3.1type_traits——类型萃取
3.1.1基本的type_traits
3.1.2根据条件选择的traits
3.1.3获取可调用对象返回类型的traits
3.1.4根据条件禁用或启用某种或某些类型traits
3.2可变参数模板
3.2.1可变参数模板函数
3.2.2可变参数模板类
3.2.3可变参数模板消除重复代码
3.3可变参数模版和type_taits的综合应用
3.3.1optional的实现
3.3.2惰性求值类lazy的实现
3.3.3dll帮助类
3.3.4lambda链式调用
3.3.5any类的实现
3.3.6function_traits
3.3.7variant的实现
3.3.8ScopeGuard
3.3.9tuple_helper
3.4总结
第4章使用C++11解决内存泄露的问题
4.1shared_ptr共享的智能指针
4.1.1shared_ptr的基本用法
4.1.2使用shared_ptr需要注意的问题
4.2unique_ptr独占的智能指针
4.3weak_ptr弱引用的智能指针
4.3.1weak_ptr基本用法
4.3.2weak_ptr返回this指针
4.3.3weak_ptr解决循环引用问题
4.4通过智能指针管理第三方库分配的内存
4.5总结
第5章使用C++11让多线程开发变得简单
5.1线程
5.1.1线程的创建
5.1.2线程的基本用法
5.2互斥量
5.2.1独占互斥量std::mutex
5.2.2递归互斥量std::recursive_mutex
5.2.3带超时的互斥量std::timed_mutex和std::recursive_timed_mutex
5.3条件变量
5.4原子变量
5.5call_once/once_flag的使用
5.6异步操作
5.6.1获取线程函数返回值的类std::future
5.6.2协助线程赋值的类std::promise
5.6.3可调用对象的包装类std::package_task
5.6.4std::promise、std::packaged_task和std::future三者之间的关系
5.7线程异步操作函数async
5.8总结
第6章使用C++11中便利的工具
6.1处理日期和时间的chrono库
6.1.1记录时长的duration
6.1.2表示时间点的timepoint
6.1.3获取系统时钟的clocks
6.1.4计时器timer
6.2数值类型和字符串的相互转换
6.3宽窄字符转换
6.4总结
第7章C++11的其他特性
7.1委托构造函数和继承构造函数
7.1.1委托构造函数
7.1.2继承构造函数
7.2原始的字面量
7.3f?inal和override关键字
7.4内存对齐
7.4.1内存对齐介绍
7.4.2堆内存的内存对齐
7.4.3利用alignas指定内存对齐大小
7.4.4利用alignof和std::alignment_of获取内存对齐大小
7.4.5内存对齐的类型std::aligned_storage
7.4.6std::max_align_t和std::align操作符
7.5C++11新增的便利算法
7.6总结

第二篇C++11工程级应用
第8章使用C++11改进我们的模式
8.1改进单例模式
8.2改进观察者模式
8.3改进访问者模式
8.4改进命令模式
8.5改进对象池模式
8.6总结
第9章使用C++11开发一个半同步半异步线程池
9.1半同步半异步线程池介绍
9.2线程池实现的关键技术分析
9.3同步队列
9.4线程池
9.5应用实例
9.6总结
第10章使用C++11开发一个轻量级的AOP库
10.1AOP介绍
10.2AOP的简单实现
10.3轻量级的AOP框架的实现
10.4总结
第11章使用C++11开发一个轻量级的IoC容器
11.1IoC容器是什么
11.2IoC创建对象
11.3类型擦除的常用方法
11.4通过Any和闭包来擦除类型
11.5创建依赖的对象
11.6完整的IoC容器
11.7总结
第12章使用C++11开发一个对象的消息总线库
12.1消息总线介绍
12.2消息总线关键技术
12.2.1通用的消息定义
12.2.2消息的注册
12.2.3消息分发
12.2.4消息总线的设计思想
12.3完整的消息总线
12.4应用实例
12.5总结
第13章使用C++11封装sqlite库
13.1sqlite基本用法介绍
13.1.1打开和关闭数据库的函数
13.1.2执行SQL语句的函数
13.2rapidjson基本用法介绍
13.2.1解析json字符串
13.2.2创建json对象
13.2.3对rapidjson的一点扩展
13.3封装sqlite的SmartDB
13.3.1打开和关闭数据库的接口
13.3.2Excecute接口
13.3.3ExecuteScalar接口
13.3.4事务接口
13.3.5ExcecuteTuple接口
13.3.6json接口
13.3.7查询接口
13.4应用实例
13.5总结
第14章使用C++11开发一个linqtoobjects库
14.1LINQ介绍
14.1.1LINQ语义
14.1.2Linq标准操作符(C#)
14.2C++中的LINQ
14.3LINQ实现的关键技术
14.3.1容器和数组的泛化
14.3.2支持所有的可调用对象
14.3.3链式调用
14.4linqtoobjects的具体实现
14.4.1一些典型LINQ操作符的实现
14.4.2完整的linqtoobjects的实现
14.5linqtoobjects的应用实例
14.6总结
第15章使用C++11开发一个轻量级的并行task库
15.1TBB的基本用法
15.1.1TBB概述
15.1.2TBB并行算法
15.1.3TBB的任务组
15.2PPL的基本用法
15.2.1PPL任务的链式连续执行
15.2.2PPL的任务组
15.3TBB和PPL的选择
15.4轻量级的并行库TaskCpp的需求
15.5TaskCpp的任务
15.5.1task的实现
15.5.2task的延续
15.6TaskCpp任务的组合
15.6.1TaskGroup
15.6.2WhenAll
15.6.3WhenAny
15.7TaskCpp并行算法
15.7.1ParallelForeach:并行对区间元素执行某种操作
15.7.2ParallelInvoke:并行调用
15.7.3ParallelReduce:并行汇聚
15.8总结
第16章使用C++11开发一个简单的通信程序
16.1反应器和主动器模式介绍
16.2asio中的Proactor
16.3asio的基本用法
16.3.1异步接口
16.3.2异步发送
16.4C++11结合asio实现一个简单的服务端程序
16.5C++11结合asio实现一个简单的客户端程序
16.6TCP粘包问题的解决
16.7总结
参考文献

前言/序言

  为什么要写这《华章原创精品·深入应用C++11:代码优化与工程级应用》2011年C++11标准刚发布时,广大C++开发者奔走相告,我也在第一时间看了C++之父Bjarne,Stroustrup的C++11FAQ(http://www.stroustrup.com/C++11FAQ.html),虽然只介绍了一部分特性,而且特性的用法介绍也很简短,但给我带来三个震撼:第一个震撼是发现我几乎不认识C++了,这么多新特性,与以前的C++很不同;第二个震撼是很多东西和其他语言类似,比如C#或者Java,感觉很酷;第三个震撼是很潮,比如lambda特性,Java都还没有(那时Java8还没出来),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/IEC14882:2011)、维基百科、MSDN和http://en.cppreference.com/w/等来学习C++11。然而,这些资料对新特性的介绍比较零散,虽然知道这些新特性的基本用法,但有时候不知道为什么需要这个新特性,在实际项目中该如何应用,或者说最佳实践是什么,这些东西网上可没有,也没有人告诉你,因为当时只有很少的人在尝试用C++11,这些都需要自己不断地去实践、去琢磨,当时多么希望能有一些指导C++11实践的资料啊。在不断实践的过程中,我对C++11的认识加深了,同时,也把应用C++11的一些心得和经验放到我的技术博客(http://www.cnblogs.com/qicosmos/)上分享出来,还开源了不少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++11的目的是为了提高生产率,让C++变得更好用和更强大,但是,这些新特性毕竟很多,面对这么多特性,初学者可能会茫然无措,找不到头绪。如果对着这些特性一一去查看标准,不仅枯燥乏味,还丧失了学习的乐趣,即使知道了新特性的基本用法,却不知道如何应用到实际开发中。针对这两个问题,《华章原创精品·深入应用C++11:代码优化与工程级应用》试图另辟蹊径来解决。《华章原创精品·深入应用C++11:代码优化与工程级应用》的前半部分将从另外一个角度去介绍这些新特性,不追求大而全,将重点放在一些常用的C++11特性上,有侧重地从另外一个角度将这些特性分门别类,即从利用这些新特性如何去改进我们现有程序的角度介绍。这种方式一来可以让读者掌握这些新特性的用法;二来还可以让读者知道这些特性是如何改进现有程序的,从而能更深刻地领悟C++11的新特性。
  如果说《华章原创精品·深入应用C++11:代码优化与工程级应用》的前半部分贴近实战,那么《华章原创精品·深入应用C++11:代码优化与工程级应用》后半部分的工程级应用就是真正的实战。后半部分将通过丰富的开发案例来介绍如何用C++11去开发项目,因为只有在实战中才能学到真东西。后半部分实战案例涉及面比较广,是笔者近年来使用C++11的经验与心得的总结。这些实践经验是针对实际开发过程中遇到的问题来选取的,它们的价值不仅可以作为C++11实践的指导,还可以直接在实际开发中应用(《华章原创精品·深入应用C++11:代码优化与工程级应用》开发案例源码遵循LGPL开源协议),相信这些实战案例一定能给读者带来更深入的思考。
  通过学习《华章原创精品·深入应用C++11:代码优化与工程级应用》基础知识与实战案例,相信读者一定能掌握大部分C++11新特性,并能应用于自己的实际开发中,充分享受C++11带来的好处。
  C++之父BjarneStroustrup曾说过:C++11看起来像一门新的语言。这个说法是否夸张,读者不妨看完《华章原创精品·深入应用C++11:代码优化与工程级应用》之后再来回味这句话。




其他推荐