STL内存管理

本文探讨了STL的两级内存配置器,一级配置器针对大于128B的内存请求,二级配置器通过数组+链表管理内存块。详细阐述了二级配置器的内存池机制,以及内存申请和释放过程。同时,对比了ptmalloc和memcached的内存管理方式,强调了内存管理在性能上的关键细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

STL中的内存管理为两级配置器,一级配置器是当申请内存大于128B时候使用系统函数malloc/free进行申请释放。

二级配置器,将内存块分为大小间距为8的16个8B到128B的等长度的chunk,使用数组+链表管理。数组中存储的是大小相同的用链表链接起来的内存块。在STL中使用长度为16的数组,0处存储8Byte,然后依次16,24,36.....依次加8字节。二级配置器维护着一个内存池,如果所申请的内存块对应的数组的链表下为空,就向池中申请,如果池中为空或者不够则就通过malloc来进行申请内存。

申请内存,首先判断是否超过128B,否则使用一级配置器。使用二级配置器,求得精确申请的内存的大小,内存对齐8。然后再定位到该大小所在的数组下的链表。判断链表是否为空,不空就返回第一个结点给用户,空则查看池中是否为空。内存池中有几种情况,第一有超过20个块的大小,则返回这20个,第二不超过20个,返回最大达到的块数,第三不足一个就将这一个链接到数组中合适的位置。如果为空则就通过malloc向池中注入2倍的所需要的+n内存即这次所申请的内存块大小的40倍大小+n,将20个大小的块连入到该数组下标下,其中的第0块返

### C++ STL 内存管理机制及其实现方式 #### 1. 基本概念 C++ 的标准模板库 (STL) 提供了一套高效的内存管理机制,旨在优化性能并减少资源浪费。这些机制主要通过 `std::allocator` 和其他底层原语实现[^2]。 #### 2. std::allocator 的作用 `std::allocator` 是 C++ 标准库中的默认分配器,负责提供基本的内存分配和对象管理功能。它定义在 `<memory>` 头文件中,并提供了以下核心方法: - **allocate**: 分配原始未初始化的内存。 - **deallocate**: 释放已分配的内存。 - **construct**: 构造对象实例。 - **destroy**: 销毁对象实例。 这种设计使得开发者可以轻松定制自己的分配策略,而无需修改容器本身的逻辑。 #### 3. SGI 实现中的内存池技术 为了进一步提升效率,特别是针对频繁的小规模内存分配场景,SGI 版本的 STL 引入了内存池的概念。具体来说,在第二级配置器 `__default_alloc_template` 中内置了一个轻量级的内存池[^5]。 当应用程序请求较小尺寸的连续存储区域时(通常小于等于 128 字节),该配置器不会直接调用操作系统级别的 `malloc` 或者 `new` 操作符,而是尝试从预先准备好的空闲链表(Free List)中获取可用块。一旦某个小块被释放回系统,则重新加入对应类型的 Free List 节点列表等待下次重用。 这种方法显著减少了因频繁调用低效全局函数而导致的时间开销以及潜在碎片化风险。 #### 4. 自动生成特殊成员函数的行为控制 (= default, = delete) 除了上述高级别的框架外,C++ 还允许程序员显式指定某些情况下如何处理类内部涉及生命周期管理的部分操作: - 使用`=default`关键字可以让编译器为我们创建一个合理的缺省版本(比如拷贝构造函数),即使我们已经声明了自己的自定义版本也不会阻止它们的存在; - 如果希望完全禁掉某特定行为则可采用`=delete`语法形式表明意图[^4]. 这不仅简化了许多常见模式下的编码工作量同时也增强了代码的安全性和可控度. ```cpp // 示例:显示定义与删除特有方法 class MyClass { public: MyClass() = default; MyClass(const MyClass&) = delete; // 禁止复制 }; ``` #### 5. 辅助工具 - 仿函数(Functor) 虽然严格意义上不属于传统意义上的“内存管理”,但在实际开发过程中经常配合使用的还有各种各样的仿函数结构体。例如算术运算相关的加减乘除取余等功能都可以借助预定义模板快速构建出来而不必每次都手写匿名lambda表达式[^3]: ```cpp #include <functional> int main(){ int a=10,b=7; auto sum = std::plus<int>()(a,b); // 计算两数之和 } ``` 以上就是围绕着C++ STL体系下有关内存管控方面的一些基础知识介绍及其背后原理剖析.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值