![]() 作者:祁宇 出版社: 机械工业出版社 副标题: 代码优化与工程级应用 出版年: 2015-5 定价: 79 装帧: 平装 ISBN: 9787111500698 内容简介 · · · · · ·在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++技术专家,致力于C++11的应用、研究和推广。金山软件WPS资深工程师,负责Android服务端开发。精通OOP、OOD、设计模式和重构,主要研究方向为架构设计和业务重构,有丰富的开发和研发管理经验。爱好C++,爱好开源,乐于研究和分享技术,开源了多个项目(github地址: https://github.com/qicosmos),在《程序员》杂志发表多篇技术文章。 2013年被评为珠海市优秀青年人才。 目录 · · · · · ·前言第一篇 C++11改进我们的程序 第1章 使用C++11让程序更简洁、更现代 2 1.1 类型推导 2 1.1.1 auto类型推导 2 1.1.2 decltype关键字 9 · · · · · ·() 前言 第一篇 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 · · · · · · () |
好好好好好
一方面满足了自己的好奇心
一种全新的角度切入
理解起来更容易