Boost C++ 库

……世界上最受推崇、设计最精良的 C++ 库项目之一。 Herb SutterAndrei Alexandrescu, C++ Coding Standards

第 27 章。Boost.PolyCollection - Boost C++ 函数库
PrevUpHomeNext

第 27 章。Boost.PolyCollection

Joaquín M López Muñoz

根据 Boost 软件许可证版本 1.0 发布。(参见随附文件 LICENSE_1_0.txt 或在 https://boost.ac.cn/LICENSE_1_0.txt 复制)

C++ 中的动态多态要求对象(例如,从抽象基类派生的类的实例)必须通过间接指针进行访问,因为它们实际的类型大小在使用点是未知的。因此,常规容器不能直接存储多态对象:通常的解决方法是使用指向堆分配元素的指针的容器。在现代计算机体系结构中,这种模式会产生两种类型的低效率:

  • 堆分配造成的内存不连续会降低 CPU 缓存性能。
  • 对一系列实际类型各不相同的多态对象执行虚拟操作会导致分支预测失败,并降低执行速度。

当特定遍历顺序与用户应用程序无关时,Boost.PolyCollection 提供了一种替代数据结构,该结构可以恢复内存的连续性,并根据具体类型打包元素。提供了四种容器类模板:

  • boost::base_collection
  • boost::function_collection
  • boost::any_collection
  • boost::variant_collection

分别处理 C++ 中四种不同类型的动态多态:

这些容器的接口与标准容器非常相似。此外,该库还提供了许多标准库算法(包括 std::for_each)的改进版本,具有更高的性能,以及一项称为类型恢复的特殊功能,该功能允许用户代码提供有关存储元素的具体类型的线索,以便进一步提高内联和虚函数消除相关的效率。

[Note] 注意

Boost.PolyCollection 是一个仅限头的库。需要 C++11 支持。该库已验证可与 Visual Studio 2015、GCC 4.8 和 Clang 3.5 配合使用。


PrevUpHomeNext