书籍作者:罗剑锋 | ISBN:9787121324604 |
书籍语言:简体中文 | 连载状态:全集 |
电子书格式:pdf,txt,epub,mobi,azw3 | 下载次数:2078 |
创建日期:2021-02-14 | 发布日期:2021-02-14 |
运行环境:PC/Windows/Linux/Mac/IOS/iPhone/iPad/Kindle/Android/安卓/平板 |
Boost 是一个功能强大、构造精巧、跨平台、开源并且完全免费的C++程序库,有着“C++‘准’标准库”的美誉。Boost 由C++标准委员会部分成员所设立的Boost 社区开发并维护,使用了许多现代C++编程技术,内容涵盖字符串处理、正则表达式、容器与数据结构、并发编程、函数式编程、泛型编程、设计模式实现等许多领域,极大地丰富了C++的功能和表现力,能够使C++软件开发更加简捷、优雅、灵活和高效。本书基于2017 年4 月发布的Boost1.64 版,介绍了其中的所有140 余个库,并且结合C++11/14/17标准详细、深入地讲解了其中数十个库,同时实现了若干颇具实用价值的工具类和函数,可帮助读者迅速地理解、掌握Boost 的用法并应用于实际的开发工作。本书内容丰富、结构严谨、详略得当、讲解透彻,带领读者领略了C++的*新前沿技术,相信会是每位C++程序员的必备工具书。
罗剑锋(网名Chrono)在1996年就读于东北财经大学;1997年开始接触C/C++;1998年参加计算机软件专业技术资格和水平考试,获高级程序员资质;2003年毕业于北京理工大学,获计算机专业硕士学位。主要研究方向为C/C++、设计模式、高性能网络服务器开发,业余爱好是阅读、旅游、欣赏音乐和电影。
《Boost程序库完全开发指南——深入C++"准”标准库(第4版)》内容丰富、结构严谨、详略得当、讲解透彻,带领读者领略了C++的*新前沿技术,相信会是每位C++程序员的必备工具书。
推荐序
最近一年我电话面试了数十位C++应聘者,惯用的暖场问题是“工作中使用过STL 的哪些组件?用过Boost 的哪些组件?”得到的答案大多集中在vector、map 和shared_ptr。如果对方是在校学生,我一般会问问vector 或map 的内部实现、各种操作的复杂度,以及迭代器失效的可能场景。如果是有经验的程序员,我还会追问shared_ptr 的线程安全性、循环引用的后果及如何避免、weak_ptr 的作用等。如果这些都回答得不错,进一步还可以问问如何实现线程安全的引用计数,如何定制删除动作等。这些问题让我能迅速地判别对方的C++水平。我之所以在面试时问到Boost,是因为其中的许多组件确实可以用于编写可维护的产品代码。Boost 包含近百个程序库,其中不乏具有工程实用价值的佳品。每个人口味与技术背景不一样,对Boost 的取舍也不一样。就我的个人经验而言,首先可以使用绝对无害的库,例如noncopyable、scoped_ptr、static_assert 等,这些库的学习和使用都比较简单,容易入手。其次,有些功能自己实现起来并不困难,正好Boost 里提供了现成的代码,那就不妨一用,比如date_time 和circular_buffer 等。然后,在新项目中,对于消息传递和资源管理可以考虑采用更加现代的方式,例如用function/bind 在某些情况下代替虚函数作为库的回调接口、借助shared_ptr 实现线程安全的对象回调等。这二者会影响整个程序的设计思路与风格,需要通盘考虑,如果正确使用智能指针,在现代C++程序里一般不需要出现delete语句。最后,对某些性能不佳的库保持警惕,比如lexical_cast。总之,在项目组成员人人都能理解并运用的基础上,适当引入现成的Boost 组件,以减少重复劳动,提高生产力。Boost 是一个宝库,其中既有可以直接拿来用的代码,也有值得借鉴的设计思路。试举一例:正则表达式库regex 对线程安全的处理。
早期的 RegEx 类不是线程安全的,它把“正则表达式”和“匹配动作”放到了一个类里边。由于有可变数据,RegEx 的对象不能跨线程使用。如今的RegEx 明确地区分了不可变(immutable)与可变(mutable)的数据,前者可以安全地跨线程共享,后者则不行。比如正则表达式本身(basic_regex)与一次匹配的结果(match_results)是不可变的;而匹配动作本身(match_regex)涉及状态更新,是可变的,于是用可重入的函数将其封装起来,不让这些数据泄露给别的线程。正是由于做了这样合理的区分,RegEx 在正常使用时就不必加锁。Donald Knuth 在“Coders at Work”一书里表达了这样一个观点:如果程序员的工作就是摆弄参数去调用现成的库,而不知道这些库是如何实现的,那么这份职业就没啥乐趣可言。换句话说,固然我们强调工作中不要重新发明轮子,但是作为一个合格的程序员,应该具备自制轮子的能力。非不能也,是不为也。
C/C++语言的一大特点是其标准库可以用语言自身实现。C 标准库的strlen、strcpy、strcmp 系列函数是教学与练习的好题材,C++标准库的complex、string、vector 则是类、资源管理、模板编程的绝佳示范。在深入了解STL 的实现之后,运用STL 自然手到擒来,并能自动避免一些错误和低效的用法。
对于 Boost 也是如此,为了消除使用时的疑虑,为了用得更顺手,有时我们需要适当了解其内部实现,甚至编写简化版用做对比验证。但是由于Boost 代码用到了日常应用程序开发中不常见的高级语法和技巧,并且为了跨多个平台和编译器而大量使用了预处理宏,阅读Boost 源码并不轻松惬意,需要下一番工夫。另一方面,如果沉迷于这些有趣的底层细节而忘了原本要解决什么问题,恐怕就舍本逐末了。
Boost 中的很多库是按泛型编程的范式来设计的,对于熟悉面向对象编程的人而言,或许面临一个思路的转变。比如,你得熟悉泛型编程的那套术语,如concept、model、refinement,才容易读懂Boost.Threads 文档中关于各种锁的描述。我想,对于熟悉STL 设计理念的人而言,这不是什么大问题。
在某些领域,Boost 不是唯一的选择,也不一定是最好的选择。比如,要生成公式化的源代码,我会首选用脚本语言写一小段代码生成程序,而不用Boost.Preprocessor;要在C++程序中嵌入领域特定语言,我会首选用Lua 或其他语言解释器,而不用Boost.Proto;要用C++程序解析上下文无关文法,我会首选用ANTLR 来定义词法与语法规则并生成解析器(parser),而不用Boost.Spirit。总之,使用Boost 时心态要平和,别较劲去改造C++语言。把它有助于提高生产力的那部分功能充分发挥出来,让项目从中受益才是关键。
要学习 Boost,除了阅读其官方网站的文档、示例与源码外,最好能有一本比较全面的中文书在手边随时翻阅。对于不谙英文的开发者,这更是可幸之至。您手上这本《Boost 程序库完全开发指南》是很好的使用指南与参考手册。作者由浅入深地介绍了Boost 的大部分常用内容,能让读者迅速了解Boost,并从中找到自己需要的部分。拿到这本书稿之后,我有粗有细地阅读了一遍,总体来看,作者水平很高,也相当务实,对C++和Boost 的理解与运用很到位,我从这本书学到了不少新知识。为此,我乐于向希望学习Boost 程序库的开发者推荐这本靠谱的书。
须知“功不唐捐”,作为一名现代C++程序员,在Boost 上投入的精力定能获得回报。
陈硕
《代码大全》译者之一
中国·香港
第4 版前言
本书初版面市至今已过去了七年的时间,这些年里我一直在持续关注 Boost/C++的发展和动态,及时更新维护这本书已经成为了我的一种习惯甚至是一种生活方式。随着C++17的发布,编写新版的工作也就自然而然地提上了日程。
这次修订的过程也是对自己的一个反省:感觉前几版有点“贪大求全”,做的是“加法”,恨不得把Boost/C++相关的所有细节都列出来,未免显得有些啰唆,所以这次的第4 版就冷静了些,开始做“减法”。在修正笔误、微调代码格式、更新date_time、test 等库之外,删去了几个实际价值不是很高的组件,例如scoped_array、swap、tokenizer 等,希望精简后阅读起来能够更加顺畅,更方便学习研究。
不过也有声音反映作者对本书的修订过于“武断”“任性”,觉得删除的内容看不到了比较可惜。为了弥补新版导致的“缺憾”,我把之前删掉的章节都做成了PDF 文件,放到了GitHub 上,感兴趣的读者可以自行下载查阅。
祝您阅读愉快,愿我们C++20 时再相见!
罗剑锋
2017 年7 月17 日于 北京 亚运村
Boost 程序库完全开发指南—深入C++“准”标准库(第4 版)
VI
第1 版前言
屈指算来,接触C++语言至今已经有十余个年头了。回首往事,不禁感慨良多。
缘起
1996 年我上大学最开始学的是Pascal,不得不说,Pascal 严谨的程序风格确实很适合作为一门教学语言,然而用于实际开发就不那么合适了(直到出现Delphi)。由于当时学校并未开设C 语言课程,因此在Pascal 课程结束后我就买书自学C/C++语言,并在次年报名计算机软件专业技术资格和水平考试,靠着一点点编程和考试的“天分”获得了高级程序员资质(当年很热衷考级考证,后来就“淡定”多了)。虽然有了资格证,但我仍然算是个C++的初学者,对于C++的认识还处于C 的面向过程和简单的基于对象层次上。
新千年伊始我考入了北京理工大学就读研究生,因为跟导师做项目开始接触STL 与C++标准库,大概是2005 年从1.33 版结识了Boost,这才真正领略了C++的精髓。那段时期Java 和C#正在国内大行其道,C++则势单力薄,有关STL 和C++标准的技术书籍寥寥无几,而讲解Boost 的书更是为零,故对Boost 的学习基本只能靠自己的摸索与实践。好在Boost自带的文档相当丰富(尽管看全英文的资料十分辛苦),而且源码也写得比较清晰规范,在熟悉了STL 的基础上学习Boost 倒也并不算太难。
但 Boost 的一个最大的特点就是“庞大”,功能组件众多,要想把它全部装进脑子里融会贯通基本上是不可能的,使用时需要经常查阅英文文档,相当麻烦。因此,在学习的过程中,我逐渐产生了编写学习笔记的想法。一开始只是一个简单的纯文本文件,记录了一些使用经验的片断,随着积累不断增加,纯文本形式已经不能满足知识整理的需求了,于是我又把这些文字迁移到了Word 文档里,把使用经验分类编目,进行较系统的归纳梳理。慢慢地,这份学习笔记居然有了上万字的规模,成为了一份很好的Boost 备忘参考,在日常的开发工作中给了我很大的帮助——就像《设计模式》一书中所说的那样,捕获了很多使用Boost 解决问题的实践经验,避免了重复发现。不过,这份资料一直仅限于我个人使用,属于“自娱自乐”的作品,从未示人。
时间一晃到了2010 年1 月份的某天夜里,不知道是什么原因我忽然失眠了,躺在床上翻来覆去怎么也睡不着。突然,一个念头闯入了脑海:把Boost 开发经验整理出版吧,让更多人能够分享这些知识,正所谓“独乐乐,与众乐乐,孰乐?”这个大胆的想法的出现让我那天的失眠又延长了几