第14章 支持分配器的通用容器

自本书开始以来,我们已经走过了很长的路。最近的章节探讨了如何编写内存高效的容器,分别介绍了在内存管理是显式进行的情况下(第12章)以及通过智能指针隐式进行的情况下(第13章)该如何操作。

选择内存管理方式并不是非此即彼的命题;每种方法都有其独特的用处,能够解决根据应用领域而定的实际问题。

然而,我们所讨论的任何方法,都无法与标准库容器所采用的方式相匹配。事实上,标准库容器(以及许多其他可以动态分配内存的标准库类型)都为“分配器感知(allocator-aware)”,可以将底层内存管理任务委托给可以由使用端代码提供的专用对象。这种设计有其优势,允许用户根据容器在内存中组织对象的方式选择合适的容器,并将该容器与一个“内存分配专家” —— 分配器(allocator) —— 相结合。这为内存管理打开了许多可能性,其中一些非常流行,例如使用从“内存池(arena)”(见第10章)或栈上的固定容量缓冲区获取内存的 std::vector。

分配器随标准库容器一起在 C++98 中正式进入 C++ 语言,但随着时间的推移,会不断发展和多样化。编写分配器在 C++11 中变得显著简化,而 C++17 则引入了一种全新的内存分配方法 —— 多态内存资源(polymorphic memory resource,PMR)分配器及其容器。

在本章中,将完成以下任务:

掌握了分配器的知识以及它们如何与容器交互之后,本章将丰富你的内存管理工具箱,并开辟将数据组织方式与存储获取方式相结合的新途径。理解分配器甚至可能减少你必须从头编写新容器的需求;有时候,与其尝试创建一个全新的容器,不如将合适的数据组织策略,与合适的存储管理方法相结合,就能解决相关的问题。