Linux多线程服务端编程:使用muduo C++网络库

Linux多线程服务端编程
分享
扫描下方二维码分享到微信
打开微信,点击右上角”+“,
使用”扫一扫“即可将网页分享到朋友圈。
作者:
出版社: 电子工业出版社
2013-01
版次: 1
ISBN: 9787121192821
定价: 89.00
装帧: 平装
开本: 16开
纸张: 胶版纸
页数: 616页
字数: 801千字
正文语种: 简体中文
  •   《Linux多线程服务端编程使用muduoC++网络库》主要讲述采用现代C++在x86-64Linux上编写多线程TCP网络服务程序的主流常规技术,重点讲解一种适应性较强的多线程服务器的编程模型,即oneloopperthread。这是在Linux下以native语言编写用户态高性能网络程序成熟的模式,掌握之后可顺利地开发各类常见的服务端网络应用程序。本书以muduo网络库为例,讲解这种编程模型的使用方法及注意事项。  《Linux多线程服务端编程使用muduoC++网络库》的宗旨是贵精不贵多。掌握两种基本的同步原语就可以满足各种多线程同步的功能需求,还能写出更易用的同步设施。掌握一种进程间通信方式和一种多线程网络编程模型就足以应对日常开发任务,编写运行于公司内网环境的分布式服务系统。   陈硕,北京师范大学硕士,擅长C++多线程网络编程和实时分布式系统架构。曾在摩根士丹利IT部门工作5年,从事实时外汇交易系统开发。现在在美国加州硅谷某互联网大公司工作,从事大规模分布式系统的可靠性工程。编写了开源C++网络库muduo,参与翻译了《代码大全(第2版)》和《C++编程规范(繁体版)》,整理了《C++Primer(第4版)(评注版)》,并曾多次在各地技术大会演讲。 第1 部分 C++ 多线程系统编程第1 章 线程安全的对象生命期管理1.1 当析构函数遇到多线程1.1.1 线程安全的定义1.1.2 MutexLock 与MutexLockGuard1.1.3 一个线程安全的Counter 示例1.2 对象的创建很简单.1.3 销毁太难1.3.1 mutex 不是办法1.3.2 作为数据成员的mutex 不能保护析构.1.4 线程安全的Observer 有多难.1.5 原始指针有何不妥.1.6 神器shared_ptr/weak_ptr1.7 插曲:系统地避免各种指针错误.1.8 应用到Observer 上1.9 再论shared_ptr 的线程安全.1.10 shared_ptr 技术与陷阱1.11 对象池.1.11.1 enable_shared_from_this1.11.2 弱回调.1.12 替代方案1.13 心得与小结.1.14 Observer 之谬.第2 章 线程同步精要2.1 互斥器(mutex) .2.1.1 只使用非递归的mutex2.1.2 死锁2.2 条件变量(condition variable) .2.3 不要用读写锁和信号量2.4 封装MutexLock、MutexLockGuard、Condition2.5 线程安全的Singleton 实现2.6 sleep(3) 不是同步原语2.7 归纳与总结.2.8 借shared_ptr 实现copy-on-write第3 章 多线程服务器的适用场合与常用编程模型3.1 进程与线程.3.2 单线程服务器的常用编程模型3.3 多线程服务器的常用编程模型3.3.1 one loop per thread3.3.2 线程池.3.3.3 推荐模式3.4 进程间通信只用TCP .3.5 多线程服务器的适用场合.3.5.1 必须用单线程的场合.3.5.2 单线程程序的优缺点.3.5.3 适用多线程程序的场景3.6 “多线程服务器的适用场合”例释与答疑第4 章 C++ 多线程系统编程精要4.1 基本线程原语的选用.4.2 C/C++ 系统库的线程安全性.4.3 Linux 上的线程标识4.4 线程的创建与销毁的守则.4.4.1 pthread_cancel 与C++ .4.4.2 exit(3) 在C++ 中不是线程安全的.4.5 善用__thread 关键字.4.6 多线程与IO4.7 用RAII 包装文件描述符.4.8 RAII 与fork() .4.9 多线程与fork() .4.10 多线程与signal4.11 Linux 新增系统调用的启示第5 章 高效的多线程日志5.1 功能需求5.2 性能需求5.3 多线程异步日志5.4 其他方案第2 部分 muduo 网络库第6 章 muduo 网络库简介6.1 由来.6.2 安装.6.3 目录结构6.3.1 代码结构6.3.2 例子6.3.3 线程模型6.4 使用教程6.4.1 TCP 网络编程本质论.6.4.2 echo 服务的实现.6.4.3 七步实现finger 服务.6.5 性能评测6.5.1 muduo 与Boost.Asio、libevent2 的吞吐量对比6.5.2 击鼓传花:对比muduo 与libevent2 的事件处理效率6.5.3 muduo 与Nginx 的吞吐量对比.6.5.4 muduo 与ZeroMQ 的延迟对比.6.6 详解muduo 多线程模型.6.6.1 数独求解服务器6.6.2 常见的并发网络服务程序设计方案.第7 章 muduo 编程示例7.1 五个简单TCP 示例7.2 文件传输7.3 Boost.Asio 的聊天服务器.7.3.1 TCP 分包7.3.2 消息格式7.3.3 编解码器LengthHeaderCodec7.3.4 服务端的实现.7.3.5 客户端的实现.7.4 muduo Buffer 类的设计与使用.7.4.1 muduo 的IO 模型7.4.2 为什么non-blocking 网络编程中应用层buffer 是必需的7.4.3 Buffer 的功能需求7.4.4 Buffer 的数据结构7.4.5 Buffer 的操作.7.4.6 其他设计方案.7.4.7 性能是不是问题7.5 一种自动反射消息类型的Google Protobuf 网络传输方案7.5.1 网络编程中使用Protobuf 的两个先决条件.7.5.2 根据type name 反射自动创建Message 对象7.5.3 Protobuf 传输格式7.6 在muduo 中实现Protobuf 编解码器与消息分发器7.6.1 什么是编解码器(codec)7.6.2 实现ProtobufCodec .7.6.3 消息分发器(dispatcher)有什么用7.6.4 ProtobufCodec 与ProtobufDispatcher 的综合运用.7.6.5 ProtobufDispatcher 的两种实现7.6.6 ProtobufCodec 和ProtobufDispatcher 有何意义.7.7 限制服务器的最大并发连接数7.7.1 为什么要限制并发连接数7.7.2 在muduo 中限制并发连接数7.8 定时器.7.8.1 程序中的时间.7.8.2 Linux 时间函数7.8.3 muduo 的定时器接口.7.8.4 Boost.Asio Timer 示例7.8.5 Java Netty 示例7.9 测量两台机器的网络延迟和时间差.7.10 用timing wheel 踢掉空闲连接7.10.1 timing wheel 原理7.10.2 代码实现与改进7.11 简单的消息广播服务.7.12 “串并转换”连接服务器及其自动化测试7.13 socks4a 代理服务器7.13.1 TCP 中继器7.13.2 socks4a 代理服务器7.13.3 N : 1 与1 : N 连接转发7.14 短址服务7.15 与其他库集成.7.15.1 UDNS .7.15.2 c-ares DNS .7.15.3 curl .7.15.4 更多第8 章 muduo 网络库设计与实现8.0 什么都不做的EventLoop .8.1 Reactor 的关键结构8.1.1 Channel class .8.1.2 Poller class8.1.3 EventLoop 的改动.8.2 TimerQueue 定时器8.2.1 TimerQueue class .8.2.2 EventLoop 的改动.8.3 EventLoop::runInLoop() 函数8.3.1 提高TimerQueue 的线程安全性.8.3.2 EventLoopThread class8.4 实现TCP 网络库8.5 TcpServer 接受新连接8.5.1 TcpServer class8.5.2 TcpConnection class .8.6 TcpConnection 断开连接.8.7 Buffer 读取数据8.7.1 TcpConnection 使用Buffer 作为输入缓冲.8.7.2 Buffer::readFd()8.8 TcpConnection 发送数据.8.9 完善TcpConnection8.9.1 SIGPIPE8.9.2 TCP No Delay 和TCP keepalive8.9.3 WriteCompleteCallback 和HighWaterMarkCallback .8.10 多线程TcpServer .8.11 Connector .8.12 TcpClient .8.13 epoll8.14 测试程序一览.第3 部分 工程实践经验谈第9 章 分布式系统工程实践9.1 我们在技术浪潮中的位置.9.1.1 分布式系统的本质困难9.1.2 分布式系统是个险恶的问题.9.2 分布式系统的可靠性浅说.9.2.1 分布式系统的软件不要求7 24 可靠9.2.2 “能随时重启进程”作为程序设计目标.9.3 分布式系统中心跳协议的设计9.4 分布式系统中的进程标识.9.4.1 错误做法9.4.2 正确做法9.4.3 TCP 协议的启示9.5 构建易于维护的分布式程序.9.6 为系统演化做准备.9.6.1 可扩展的消息格式9.6.2 反面教材:ICE 的消息打包格式.9.7 分布式程序的自动化回归测试9.7.1 单元测试的能与不能.9.7.2 分布式系统测试的要点9.7.3 分布式系统的抽象观点9.7.4 一种自动化的回归测试方案.9.7.5 其他用处9.8 分布式系统部署、监控与进程管理的几重境界.9.8.1 境界1:全手工操作.9.8.2 境界2:使用零散的自动化脚本和第三方组件.9.8.3 境界3:自制机群管理系统,集中化配置.9.8.4 境界4:机群管理与naming service 结合.第10 章 C++ 编译链接模型精要10.1 C 语言的编译模型及其成因.10.1.1 为什么C 语言需要预处理10.1.2 C 语言的编译模型.10.2 C++ 的编译模型10.2.1 单遍编译10.2.2 前向声明10.3 C++ 链接(linking) .10.3.1 函数重载10.3.2 inline 函数.10.3.3 模板10.3.4 虚函数.10.4 工程项目中头文件的使用规则10.4.1 头文件的害处.10.4.2 头文件的使用规则10.5 工程项目中库文件的组织原则10.5.1 动态库是有害的10.5.2 静态库也好不到哪儿去10.5.3 源码编译是王道第11 章 反思C++ 面向对象与虚函数11.1 朴实的C++ 设计11.2 程序库的二进制兼容性11.2.1 什么是二进制兼容性.11.2.2 有哪些情况会破坏库的ABI .11.2.3 哪些做法多半是安全的11.2.4 反面教材:COM .11.2.5 解决办法11.3 避免使用虚函数作为库的接口11.3.1 C++ 程序库的作者的生存环境11.3.2 虚函数作为库的接口的两大用途11.3.3 虚函数作为接口的弊端11.3.4 假如Linux 系统调用以COM 接口方式实现11.3.5 Java 是如何应对的11.4 动态库接口的推荐做法11.5 以boost::function 和boost::bind 取代虚函数.11.5.1 基本用途11.5.2 对程序库的影响11.5.3 对面向对象程序设计的影响.11.6 iostream 的用途与局限11.6.1 stdio 格式化输入输出的缺点.11.6.2 iostream 的设计初衷.11.6.3 iostream 与标准库其他组件的交互.11.6.4 iostream 在使用方面的缺点.11.6.5 iostream 在设计方面的缺点.11.6.6 一个300 行的memory buffer output stream .11.6.7 现实的C++ 程序如何做文件IO .11.7 值语义与数据抽象.11.7.1 什么是值语义.11.7.2 值语义与生命期11.7.3 值语义与标准库11.7.4 值语义与C++ 语言11.7.5 什么是数据抽象11.7.6 数据抽象所需的语言设施11.7.7 数据抽象的例子第12 章 C++ 经验谈12.1 用异或来交换变量是错误的.12.1.1 编译器会分别生成什么代码.12.1.2 为什么短的代码不一定快12.2 不要重载全局::operator new()12.2.1 内存管理的基本要求.12.2.2 重载::operator new() 的理由.12.2.3 ::operator new() 的两种重载方式.12.2.4 现实的开发环境12.2.5 重载::operator new() 的困境.12.2.6 解决办法:替换malloc()12.2.7 为单独的class 重载::operator new() 有问题吗.12.2.8 有必要自行定制内存分配器吗12.3 带符号整数的除法与余数.12.3.1 语言标准怎么说12.3.2 C/C++ 编译器的表现.12.3.3 其他语言的规定12.3.4 脚本语言解释器代码.12.3.5 硬件实现12.4 在单元测试中mock 系统调用12.4.1 系统函数的依赖注入.12.4.2 链接期垫片(link seam)12.5 慎用匿名namespace .12.5.1 C 语言的static 关键字的两种用法.12.5.2 C++ 语言的static 关键字的四种用法12.5.3 匿名namespace 的不利之处.12.5.4 替代办法12.6 采用有利于版本管理的代码格式.12.6.1 对diff 友好的代码格式12.6.2 对grep 友好的代码风格.12.6.3 一切为了效率.12.7 再探std::string .12.7.1 直接拷贝(eager copy) .12.7.2 写时复制(copy-on-write) .12.7.3 短字符串优化(SSO)12.8 用STL algorithm 轻松解决几道算法面试题12.8.1 用next_permutation() 生成排列与组合12.8.2 用unique() 去除连续重复空白.12.8.3 用{make,push,pop}_heap() 实现多路归并12.8.4 用partition() 实现“重排数组,让奇数位于偶数前面”12.8.5 用lower_bound() 查找IP 地址所属的城市.第4 部分 附录附录A 谈一谈网络编程学习经验附录B 从《C++ Primer(第4 版)》入手学习C++附录C 关于Boost 的看法附录D 关于TCP 并发连接的几个思考题与试验
  • 内容简介:
      《Linux多线程服务端编程使用muduoC++网络库》主要讲述采用现代C++在x86-64Linux上编写多线程TCP网络服务程序的主流常规技术,重点讲解一种适应性较强的多线程服务器的编程模型,即oneloopperthread。这是在Linux下以native语言编写用户态高性能网络程序成熟的模式,掌握之后可顺利地开发各类常见的服务端网络应用程序。本书以muduo网络库为例,讲解这种编程模型的使用方法及注意事项。  《Linux多线程服务端编程使用muduoC++网络库》的宗旨是贵精不贵多。掌握两种基本的同步原语就可以满足各种多线程同步的功能需求,还能写出更易用的同步设施。掌握一种进程间通信方式和一种多线程网络编程模型就足以应对日常开发任务,编写运行于公司内网环境的分布式服务系统。
  • 作者简介:
      陈硕,北京师范大学硕士,擅长C++多线程网络编程和实时分布式系统架构。曾在摩根士丹利IT部门工作5年,从事实时外汇交易系统开发。现在在美国加州硅谷某互联网大公司工作,从事大规模分布式系统的可靠性工程。编写了开源C++网络库muduo,参与翻译了《代码大全(第2版)》和《C++编程规范(繁体版)》,整理了《C++Primer(第4版)(评注版)》,并曾多次在各地技术大会演讲。
  • 目录:
    第1 部分 C++ 多线程系统编程第1 章 线程安全的对象生命期管理1.1 当析构函数遇到多线程1.1.1 线程安全的定义1.1.2 MutexLock 与MutexLockGuard1.1.3 一个线程安全的Counter 示例1.2 对象的创建很简单.1.3 销毁太难1.3.1 mutex 不是办法1.3.2 作为数据成员的mutex 不能保护析构.1.4 线程安全的Observer 有多难.1.5 原始指针有何不妥.1.6 神器shared_ptr/weak_ptr1.7 插曲:系统地避免各种指针错误.1.8 应用到Observer 上1.9 再论shared_ptr 的线程安全.1.10 shared_ptr 技术与陷阱1.11 对象池.1.11.1 enable_shared_from_this1.11.2 弱回调.1.12 替代方案1.13 心得与小结.1.14 Observer 之谬.第2 章 线程同步精要2.1 互斥器(mutex) .2.1.1 只使用非递归的mutex2.1.2 死锁2.2 条件变量(condition variable) .2.3 不要用读写锁和信号量2.4 封装MutexLock、MutexLockGuard、Condition2.5 线程安全的Singleton 实现2.6 sleep(3) 不是同步原语2.7 归纳与总结.2.8 借shared_ptr 实现copy-on-write第3 章 多线程服务器的适用场合与常用编程模型3.1 进程与线程.3.2 单线程服务器的常用编程模型3.3 多线程服务器的常用编程模型3.3.1 one loop per thread3.3.2 线程池.3.3.3 推荐模式3.4 进程间通信只用TCP .3.5 多线程服务器的适用场合.3.5.1 必须用单线程的场合.3.5.2 单线程程序的优缺点.3.5.3 适用多线程程序的场景3.6 “多线程服务器的适用场合”例释与答疑第4 章 C++ 多线程系统编程精要4.1 基本线程原语的选用.4.2 C/C++ 系统库的线程安全性.4.3 Linux 上的线程标识4.4 线程的创建与销毁的守则.4.4.1 pthread_cancel 与C++ .4.4.2 exit(3) 在C++ 中不是线程安全的.4.5 善用__thread 关键字.4.6 多线程与IO4.7 用RAII 包装文件描述符.4.8 RAII 与fork() .4.9 多线程与fork() .4.10 多线程与signal4.11 Linux 新增系统调用的启示第5 章 高效的多线程日志5.1 功能需求5.2 性能需求5.3 多线程异步日志5.4 其他方案第2 部分 muduo 网络库第6 章 muduo 网络库简介6.1 由来.6.2 安装.6.3 目录结构6.3.1 代码结构6.3.2 例子6.3.3 线程模型6.4 使用教程6.4.1 TCP 网络编程本质论.6.4.2 echo 服务的实现.6.4.3 七步实现finger 服务.6.5 性能评测6.5.1 muduo 与Boost.Asio、libevent2 的吞吐量对比6.5.2 击鼓传花:对比muduo 与libevent2 的事件处理效率6.5.3 muduo 与Nginx 的吞吐量对比.6.5.4 muduo 与ZeroMQ 的延迟对比.6.6 详解muduo 多线程模型.6.6.1 数独求解服务器6.6.2 常见的并发网络服务程序设计方案.第7 章 muduo 编程示例7.1 五个简单TCP 示例7.2 文件传输7.3 Boost.Asio 的聊天服务器.7.3.1 TCP 分包7.3.2 消息格式7.3.3 编解码器LengthHeaderCodec7.3.4 服务端的实现.7.3.5 客户端的实现.7.4 muduo Buffer 类的设计与使用.7.4.1 muduo 的IO 模型7.4.2 为什么non-blocking 网络编程中应用层buffer 是必需的7.4.3 Buffer 的功能需求7.4.4 Buffer 的数据结构7.4.5 Buffer 的操作.7.4.6 其他设计方案.7.4.7 性能是不是问题7.5 一种自动反射消息类型的Google Protobuf 网络传输方案7.5.1 网络编程中使用Protobuf 的两个先决条件.7.5.2 根据type name 反射自动创建Message 对象7.5.3 Protobuf 传输格式7.6 在muduo 中实现Protobuf 编解码器与消息分发器7.6.1 什么是编解码器(codec)7.6.2 实现ProtobufCodec .7.6.3 消息分发器(dispatcher)有什么用7.6.4 ProtobufCodec 与ProtobufDispatcher 的综合运用.7.6.5 ProtobufDispatcher 的两种实现7.6.6 ProtobufCodec 和ProtobufDispatcher 有何意义.7.7 限制服务器的最大并发连接数7.7.1 为什么要限制并发连接数7.7.2 在muduo 中限制并发连接数7.8 定时器.7.8.1 程序中的时间.7.8.2 Linux 时间函数7.8.3 muduo 的定时器接口.7.8.4 Boost.Asio Timer 示例7.8.5 Java Netty 示例7.9 测量两台机器的网络延迟和时间差.7.10 用timing wheel 踢掉空闲连接7.10.1 timing wheel 原理7.10.2 代码实现与改进7.11 简单的消息广播服务.7.12 “串并转换”连接服务器及其自动化测试7.13 socks4a 代理服务器7.13.1 TCP 中继器7.13.2 socks4a 代理服务器7.13.3 N : 1 与1 : N 连接转发7.14 短址服务7.15 与其他库集成.7.15.1 UDNS .7.15.2 c-ares DNS .7.15.3 curl .7.15.4 更多第8 章 muduo 网络库设计与实现8.0 什么都不做的EventLoop .8.1 Reactor 的关键结构8.1.1 Channel class .8.1.2 Poller class8.1.3 EventLoop 的改动.8.2 TimerQueue 定时器8.2.1 TimerQueue class .8.2.2 EventLoop 的改动.8.3 EventLoop::runInLoop() 函数8.3.1 提高TimerQueue 的线程安全性.8.3.2 EventLoopThread class8.4 实现TCP 网络库8.5 TcpServer 接受新连接8.5.1 TcpServer class8.5.2 TcpConnection class .8.6 TcpConnection 断开连接.8.7 Buffer 读取数据8.7.1 TcpConnection 使用Buffer 作为输入缓冲.8.7.2 Buffer::readFd()8.8 TcpConnection 发送数据.8.9 完善TcpConnection8.9.1 SIGPIPE8.9.2 TCP No Delay 和TCP keepalive8.9.3 WriteCompleteCallback 和HighWaterMarkCallback .8.10 多线程TcpServer .8.11 Connector .8.12 TcpClient .8.13 epoll8.14 测试程序一览.第3 部分 工程实践经验谈第9 章 分布式系统工程实践9.1 我们在技术浪潮中的位置.9.1.1 分布式系统的本质困难9.1.2 分布式系统是个险恶的问题.9.2 分布式系统的可靠性浅说.9.2.1 分布式系统的软件不要求7 24 可靠9.2.2 “能随时重启进程”作为程序设计目标.9.3 分布式系统中心跳协议的设计9.4 分布式系统中的进程标识.9.4.1 错误做法9.4.2 正确做法9.4.3 TCP 协议的启示9.5 构建易于维护的分布式程序.9.6 为系统演化做准备.9.6.1 可扩展的消息格式9.6.2 反面教材:ICE 的消息打包格式.9.7 分布式程序的自动化回归测试9.7.1 单元测试的能与不能.9.7.2 分布式系统测试的要点9.7.3 分布式系统的抽象观点9.7.4 一种自动化的回归测试方案.9.7.5 其他用处9.8 分布式系统部署、监控与进程管理的几重境界.9.8.1 境界1:全手工操作.9.8.2 境界2:使用零散的自动化脚本和第三方组件.9.8.3 境界3:自制机群管理系统,集中化配置.9.8.4 境界4:机群管理与naming service 结合.第10 章 C++ 编译链接模型精要10.1 C 语言的编译模型及其成因.10.1.1 为什么C 语言需要预处理10.1.2 C 语言的编译模型.10.2 C++ 的编译模型10.2.1 单遍编译10.2.2 前向声明10.3 C++ 链接(linking) .10.3.1 函数重载10.3.2 inline 函数.10.3.3 模板10.3.4 虚函数.10.4 工程项目中头文件的使用规则10.4.1 头文件的害处.10.4.2 头文件的使用规则10.5 工程项目中库文件的组织原则10.5.1 动态库是有害的10.5.2 静态库也好不到哪儿去10.5.3 源码编译是王道第11 章 反思C++ 面向对象与虚函数11.1 朴实的C++ 设计11.2 程序库的二进制兼容性11.2.1 什么是二进制兼容性.11.2.2 有哪些情况会破坏库的ABI .11.2.3 哪些做法多半是安全的11.2.4 反面教材:COM .11.2.5 解决办法11.3 避免使用虚函数作为库的接口11.3.1 C++ 程序库的作者的生存环境11.3.2 虚函数作为库的接口的两大用途11.3.3 虚函数作为接口的弊端11.3.4 假如Linux 系统调用以COM 接口方式实现11.3.5 Java 是如何应对的11.4 动态库接口的推荐做法11.5 以boost::function 和boost::bind 取代虚函数.11.5.1 基本用途11.5.2 对程序库的影响11.5.3 对面向对象程序设计的影响.11.6 iostream 的用途与局限11.6.1 stdio 格式化输入输出的缺点.11.6.2 iostream 的设计初衷.11.6.3 iostream 与标准库其他组件的交互.11.6.4 iostream 在使用方面的缺点.11.6.5 iostream 在设计方面的缺点.11.6.6 一个300 行的memory buffer output stream .11.6.7 现实的C++ 程序如何做文件IO .11.7 值语义与数据抽象.11.7.1 什么是值语义.11.7.2 值语义与生命期11.7.3 值语义与标准库11.7.4 值语义与C++ 语言11.7.5 什么是数据抽象11.7.6 数据抽象所需的语言设施11.7.7 数据抽象的例子第12 章 C++ 经验谈12.1 用异或来交换变量是错误的.12.1.1 编译器会分别生成什么代码.12.1.2 为什么短的代码不一定快12.2 不要重载全局::operator new()12.2.1 内存管理的基本要求.12.2.2 重载::operator new() 的理由.12.2.3 ::operator new() 的两种重载方式.12.2.4 现实的开发环境12.2.5 重载::operator new() 的困境.12.2.6 解决办法:替换malloc()12.2.7 为单独的class 重载::operator new() 有问题吗.12.2.8 有必要自行定制内存分配器吗12.3 带符号整数的除法与余数.12.3.1 语言标准怎么说12.3.2 C/C++ 编译器的表现.12.3.3 其他语言的规定12.3.4 脚本语言解释器代码.12.3.5 硬件实现12.4 在单元测试中mock 系统调用12.4.1 系统函数的依赖注入.12.4.2 链接期垫片(link seam)12.5 慎用匿名namespace .12.5.1 C 语言的static 关键字的两种用法.12.5.2 C++ 语言的static 关键字的四种用法12.5.3 匿名namespace 的不利之处.12.5.4 替代办法12.6 采用有利于版本管理的代码格式.12.6.1 对diff 友好的代码格式12.6.2 对grep 友好的代码风格.12.6.3 一切为了效率.12.7 再探std::string .12.7.1 直接拷贝(eager copy) .12.7.2 写时复制(copy-on-write) .12.7.3 短字符串优化(SSO)12.8 用STL algorithm 轻松解决几道算法面试题12.8.1 用next_permutation() 生成排列与组合12.8.2 用unique() 去除连续重复空白.12.8.3 用{make,push,pop}_heap() 实现多路归并12.8.4 用partition() 实现“重排数组,让奇数位于偶数前面”12.8.5 用lower_bound() 查找IP 地址所属的城市.第4 部分 附录附录A 谈一谈网络编程学习经验附录B 从《C++ Primer(第4 版)》入手学习C++附录C 关于Boost 的看法附录D 关于TCP 并发连接的几个思考题与试验
查看详情
12