现代 C++ 编程实战
吴咏炜
前 Intel 资深软件架构师
34199 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 51 讲
加餐 (1讲)
现代 C++ 编程实战
15
15
1.0x
00:00/00:00
登录|注册

32|容器里的内存管理:分配器

单参数构造函数
默认构造函数
is_equal
deallocate
allocate
deallocate(void* p, size_t n)
allocate(size_t n)
malloc_alloc
single_client_alloc
pthread_alloc
alloc
[11] cppreference.com - monotonic_buffer_resource
[10] cppreference.com - unsynchronized_pool_resource
[9] cppreference.com - synchronized_pool_resource
[8] cppreference.com - null_memory_resource
[7] cppreference.com - new_delete_resource
[6] cppreference.com - set_default_resource
[5] cppreference.com - get_default_resource
[4] cppreference.com - polymorphic_allocator
[3] cppreference.com - memory_resource
[2] cppreference.com - Allocator
[1] SGI STL 文档
洋葱原则在设计中的体现
阅读 C++ 标准库分配器源码
多态分配器
分配器特征
标准分配器
SGI STL 分配器
分配器概念
系统工程:类型不同
容器别名模板简化使用
移动赋值行为变化
注入方式
polymorphic_allocator 使用 memory_resource
new_delete_alloc_resource 示例
memory_resource 抽象类
分配器是容器类型的一部分
处理可能缺失的成员
提供默认版本
constructdestroy 函数(C++17 废弃)
allocatedeallocate 函数
类型别名
示例实现
分配器可以有自己的状态
allocator_traits 简化实现
过度设计:constructdestroy
可能存在兼容性问题
不再是静态成员函数
成员函数 allocatedeallocate
需提供静态成员函数
C++ 标准化后,多数使用 std::allocator
分配器目的:分离对象构造和内存分配
多种分配器优化不同场景
SGI STL 引入分配器概念
参考资料
课后思考
内容小结
多态分配器的影响
多态分配器 polymorphic_allocator
分配器特征 allocator_traits
标准分配器 std::allocator
C++11 及以后
C++98 分配器
SGI STL 分配器
历史背景
内存管理:分配器

该思维导图由 AI 生成,仅供参考

你好,我是吴咏炜。
上一讲里我们讨论了 C++ 里内存管理的基本工具,分配和释放函数。今天,我们来讨论一下容器里管理内存的机制——分配器(allocator)。

一点点历史

从网上可以找到的 SGI STL 的文档 [1] 中能够看到,在 C++ 标准化之前,STL 已经引入了分配器的概念,并且还引入了多种分配器,为不同的使用场景进行优化:
alloc:线程安全的默认分配器;默认对小于 128 字节的分配要求使用内存池,超过则使用 malloc_alloc
pthread_alloc:每线程使用独立内存池的分配器
single_client_alloc:线程不安全的快速分配器
malloc_alloc:调用 mallocfree 来分配和释放内存的分配器
分配器的目的是分离对象的构造和内存分配。显然,这种方式把内存分配的决策交给了容器(而非对象),带来了很大的灵活性,性能上也有好处,因此较早的 C++ 标准库的实现也都沿袭了 SGI STL 里的这些分配器。
不过,随着时间的发展,大家也慢慢放弃了 SGI STL 实现里的这些不同的分配器,而只使用 C++ 标准里定义的 std::allocator 了。除了标准里定义的分配器和 SGI STL 的接口不同外,一个很重要的原因恐怕是分配器是容器类型的一部分,因此使用不同分配器的容器是不同的类型:一个要求 vector<int>& 作为形参类型的函数,是不能接受 vector<int, single_client_alloc<int> > 作为实参类型的。这个问题要到 C++17 引入多态分配器(polymorphic_allocator)才算部分得到解决。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入探讨了C++中的容器内存管理机制,着重介绍了分配器(allocator)的演变历程和多态分配器的应用。文章首先回顾了SGI STL引入的多种分配器以及C++标准库中的std::allocator,随后讨论了C++98和C++11对分配器的要求和改进,以及标准分配器std::allocator的示例实现。重点介绍了分配器的重要成员函数allocate和deallocate,以及rebind(重新绑定)成员类模板的作用。此外,文章还详细讲解了多态分配器的概念和内存资源对象的使用,以及多态分配器在容器中的应用。通过对分配器的演变历程和多态分配器的实现进行解析,帮助读者深入了解了容器内存管理的机制和C++标准库中的分配器。整体而言,本文为读者提供了深入的技术细节和实际应用场景,为他们理解和应用容器内存管理提供了有力支持。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《现代 C++ 编程实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(8)

  • 最新
  • 精选
  • 易轻尘
    这一篇真是太干了,读了好久

    作者回复: 😝 我写起来也花了挺久。😂

    2022-06-26
    2
  • 李云龙
    老师, polymorphic_allocator 与 memory resource 的关系感觉很像是pimpl设计模式,老师您看我这样理解正确吗?

    作者回复: 有点像。但我觉得拿多态、继承、虚函数那套来理解更好。

    2023-11-13归属地:北京
    1
  • coming
    洋葱理念, 用它就好, 别多想, 要不你会辣眼睛的

    作者回复: 需要写、该写的时候写(大部分人确实不需要)。我在项目里写过内存池分配器。

    2023-05-02归属地:上海
  • Cafba
    老师,请问目前STL源码相关的书籍有什么推荐的吗,或者说手写STL如何入门呢,STL源码剖析这本书有些过时,现在还有必要看吗

    作者回复: 书是有点过时,但好像也没有更好的书出来。了解了STL的基本理念和模板的高级用法后,STL代码还是可以看懂的。建议看libc++的源码(LLVM里)。

    2023-02-11归属地:甘肃
  • jcy
    吴老师,想了解一下有哪些有名的项目使用了多态分配器?在目前工业界使用情况是怎么样的?

    作者回复: 抱歉,我真的还没见过…… 但肯定有公司在用类似的东西。这东西的提案方我记得是 Bloomberg,他们就用了类似的东西,虽然不是标准库的这个——他们在这个功能标准化之前就已经实现了自己的多态分配器了。

    2022-05-15
  • 禾桃
    template <typename T, typename... Args> using __has_construct = …; 这个看上去好酷,很神奇

    作者回复: 具体实现到源码里面找一下就能看到。

    2022-04-22
  • V万能的小黑V
    我发现不但可以和老师学技术,还能学英语哈哈哈……
    2022-03-19
    1
  • 邵年紧时
    吴老师真良心。
    2022-03-07
    1
收起评论
显示
设置
留言
8
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部