32|容器里的内存管理:分配器
吴咏炜
该思维导图由 AI 生成,仅供参考
你好,我是吴咏炜。
上一讲里我们讨论了 C++ 里内存管理的基本工具,分配和释放函数。今天,我们来讨论一下容器里管理内存的机制——分配器(allocator)。
一点点历史
从网上可以找到的 SGI STL 的文档 [1] 中能够看到,在 C++ 标准化之前,STL 已经引入了分配器的概念,并且还引入了多种分配器,为不同的使用场景进行优化:
alloc:线程安全的默认分配器;默认对小于 128 字节的分配要求使用内存池,超过则使用 malloc_alloc
pthread_alloc:每线程使用独立内存池的分配器
single_client_alloc:线程不安全的快速分配器
malloc_alloc:调用 malloc 和 free 来分配和释放内存的分配器
分配器的目的是分离对象的构造和内存分配。显然,这种方式把内存分配的决策交给了容器(而非对象),带来了很大的灵活性,性能上也有好处,因此较早的 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
《现代 C++ 编程实战》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(8)
- 最新
- 精选
- 易轻尘这一篇真是太干了,读了好久
作者回复: 😝 我写起来也花了挺久。😂
2022-06-262 - 李云龙老师, 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-191
- 邵年紧时吴老师真良心。2022-03-071
收起评论