当前位置: 首页 > web >正文

STL 6分配器

1. 分配器

1.分配器的核心功能
1.内存分配:替代 operator new 和 operator delete,提供自定义内存管理。
2.对象构造 / 析构:分离内存分配与对象构造(通过 construct 和 destroy 方法)。
3.类型抽象:使容器与具体内存管理解耦,支持不同的内存策略。

1.标准库中的默认分配器

所有 STL 容器默认使用 std::allocator,它是一个简单的包装,直接调用 operator new 和 operator delete。

1. rebind

在 C++ STL 分配器中,rebind 是一个必须实现的嵌套模板结构体,其核心作用是允许分配器为不同类型的对象创建适配版本。这是分配器设计中的一个关键机制,用于处理容器内部可能需要的不同类型的内存分配。

STL 容器(如 vector, list, map 等)在实现时可能需要为不同类型的对象分配内存。例如:

vector 需要为 T 类型的元素分配内存。
list 需要为 list 内部的节点(通常包含 T 和指向前 / 后节点的指针)分配内存。
map<K, V> 需要为键值对 pair<const K, V> 分配内存。

2. 分配器包含多个元素类型

STL 设计遵循泛型编程原则,要求组件之间通过统一接口进行交互。分配器作为内存管理的核心组件,需要提供以下信息:

1.操作对象的类型:分配器操作的元素类型是什么?
2.指针和引用的类型:如何表示指向元素的指针和引用?
3.大小和距离的类型:如何表示内存块的大小和指针间的距离?

通过类型别名,分配器将这些信息暴露给容器和算法,使它们能够在不依赖具体实现的情况下正确操作内存。

代码展示

template<typename T>struct MyAllocator {using value_type      = T;using pointer         = T*;using const_pointer   = const T*;using reference       = T&;using const_reference = const T&;using size_type       = std::size_t;using difference_type = std::ptrdiff_t;// 必须提供 rebind 模板template<typename U>struct rebind { using other = MyAllocator<U>; };};

需实现函数

pointer allocate(size_type n); // 分配 n 个 T 对象的内存
void deallocate(pointer p, size_type n);  // 释放内存
template<typename... Args>void construct(pointer p, Args&&... args);      // 构造对象
void destroy(pointer p);   // 析构对象

提升
1.实现日志分配器:记录内存分配和释放的大小、频率。
2.内存池分配器:为固定大小的对象优化内存分配。
3.堆外内存分配器:将数据存储在共享内存或 GPU 内存中。

http://www.xdnf.cn/news/13274.html

相关文章:

  • 智能文档结构化技术的应用,重塑合同管理模式
  • CSS Modules使用
  • [特殊字符] 以太坊智能合约:原理、执行与核心机制
  • 新能源汽车智慧充电桩管理方案:智能安全识别的实际应用
  • mysql为什么一个表中不能同时存在两个字段自增
  • Q: dify的QA分段方式,question、answer和keywords哪些内容进入向量库呢?
  • 【已解决】python的kafka-python包连接kafka报认证失败
  • 【在线五子棋对战】四、MySQL API 使用
  • 多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度​
  • Llama 4开源项目多维分析研究
  • VUE element table 列合并
  • 目标检测中F1-Score指标的详细解析:深度理解,避免误区
  • Nginx攻略
  • C# vs2022 找不到指定的 SDK“Microsof.NET.Sdk
  • Android Wi-Fi 连接失败日志分析
  • 第六章 外部中断
  • 智能合约安全专题(一):什么是重入攻击?——从 DAO 事件谈起
  • Vuex 自动化生成工具
  • 【RPA干货】RPA自动化程序是什么?-rpa百科
  • 十四、【ESP32全栈开发指南:搭建轻量级HTTP服务器】
  • 【C++】IO流
  • Spring Boot循环依赖全场景解析与终极解决方案
  • MongoDB(八) - MongoDB GridFS介绍及使用Python操作GridFS
  • 云计算——弹性云服务器(ECS)和裸金属服务器(BMS)
  • 【数据结构】图算法(代码)
  • Qt绘制电池图标源码分享
  • 《信号与系统》第 7 章 采样
  • VScode - 我的常用插件01 - 主题插件Noctis
  • Centos 安装 Sqoop
  • STM32H7 CubeMx 串口一配置