《Boost程序库完全开发指南》读书笔记

书名:《Boost程序库完全开发指南:深入C++“准”标准库》
作者:罗剑锋
读完:2020-10-21 · 微信读书

这是一本讲 Boost 程序库用法的书。这里摘的内容涉及智能指针、内存池、一组实用小工具,以及 function、signals2 这类回调相关的组件。

下面是我的划线,按主题整理。

一、智能指针

shared_ptr几乎可以在任何new出现的地方接收new的动态分配结果,然后被任意使用,从而完全消灭delete的使用和内存泄漏,而它的用法与scoped_ptr一样简单。

make_shared()函数可以接收若干个参数,然后把它们传递给类型T的构造函数,创建一个shared_ptr<T>的对象并返回。通常使用make_shared()函数要比直接创建shared_ptr对象的方式快且高效,因为它内部仅分配一次内存,消除了shared_ptr构造时的“开销”。

shared_ptr的很多其他用法,如实现pimpl惯用法、应用于工厂模式、别名构造、持有任意对象的指针等,这些用法进一步展示了shared_ptr的强大功能。

……还提供了工厂函数make_unique()和make_shared(),进一步消除了代码中的new操作符。

二、内存池

boost.pool库基于简单分隔存储的思想实现了一个快速、紧凑的内存池库,不仅能够管理大量的对象,还可以用作STL的内存分配器。在某种程度上讲,它近似于一个小型的垃圾回收机制,在需要大量分配/释放小对象时其效率很高,而且完全不需要考虑delete

pool库提供了pool、object_pool、singleton_pool等内存池,适用于各种情形。完全可以把它们当作一个小型的垃圾回收机制,因此可以在内存池中随意地动态创建对象,完全不用关心它的回收问题,也无须对原有类做任何形式的修改。尤其是object_pool,它可以统一管理各种对象的创建与销毁,能够很好地应用在各种规模的面向对象的软件系统中

三、实用小工具

noncopyable,它为定义一个不允许拷贝的类提供了简单而清晰的解决方法,可以节省很多代码和时间。应当总用boost::noncopyable的名字空间域限定形式来使用它,而不用using语句,避免在头文件里打开boost名字空间。

ignore_unused是一个很小的工具,它可以消除一些暂时未使用的变量或类型定义所产生的警告,其命名清晰,有利于代码后续的维护工作。

optional库使用容器语义,为无效值提供了一个很好的解决方案。它类似容器与智能指针的混合体,可以容纳任意类型的元素,同时又提供operator*和operator->重载,可以像指针一样访问元素。在使用optional存储的元素之前,必须测试其有效性。

assign库演示了重载逗号、括号操作符的“神奇”用法,这比标准里的初始化列表功能更强大。利用C++的“语法糖”特性,我们可以写出“不可思议”的代码,轻松完成原本要用一大堆代码才能完成的初始化或赋值任务,它在构建原型或测试程序时非常有用。assign库对标准容器、容器适配器和Boost容器都提供了很全面的支持,这使得它具有很高的使用价值

tribool实现了三态布尔逻辑,如同语言内置的bool类型一样简单好用

uuid组件实现了对UUID值的表示和处理,提供了基于名字和随机数的生成算法生成唯一的标识符,可以用在很多地方来唯一地标识对象。

四、function 与 signals2

前两条说的是 function。

它以对象的形式封装了原始的函数指针或函数对象,能够容纳任意符合函数签名的可调用对象。因此它可以被用于回调机制,暂时保管函数或函数对象,在之后需要的时机再调用这些函数或函数对象,使回调机制拥有更多的弹性。

function可以配合bind/lambda使用,以存储bind/lambda表达式的结果,使bind/lambda能够被多次调用。

signal对象在创建时会自动创建一个mutex保护内部状态,每一个插槽连接时也会创建一个新的mutex,当信号或插槽被调用时mutex会自动锁定,因此signal可以很好地工作于多线程环境。

请我喝杯咖啡