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

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.dtcms.com/a/242664.html

相关文章:

  • matlab画图时如何屏蔽title等函数中缺省的latex解释
  • AI销售工具开发指南:关键技术点与行业解决方案
  • 在鸿蒙HarmonyOS 5中HarmonyOS应用开发实现QQ音乐风格的播放功能
  • C++ mutex 锁的使用
  • day27/60
  • 在鸿蒙HarmonyOS 5中实现抖音风格的草稿箱功能
  • 新能源知识库(34)什么是单一制和两部制
  • 经典的多位gpio初始化操作
  • JetBrains IntelliJ IDEA插件推荐
  • Spring MVC 核心枢纽:DispatcherServlet 的深度解析与实践价值
  • Zynq multi boot及网口远程更新开发
  • .Net框架,除了EF还有很多很多......
  • 简易版抽奖活动的设计技术方案
  • 数据库管理与高可用-PostgreSQL初体验
  • 安全编程期末复习34(红色重点向下兼容)
  • 8.1.排序的基本概念
  • ArkUI-X平台差异化
  • 函数中的Callable
  • Web安全漏洞详解及解决方案
  • 行业 |5G六年,互联网改变了什么?
  • Vue 2.0 + C# + OnlyOffice 开发
  • GO自带日志库log包解释
  • RAG->大模型搜索search-R1
  • Java中高并发线程池的相关面试题详解
  • AE之番外篇
  • 模型上下文协议(MCP)实践指南
  • 深入解析默认值工具类:DefaultUtil
  • TF-IDF算法详解与实践总结
  • 上海市计算机学会竞赛平台第六届上海市青少年算法竞赛网络赛(青年组)平方的和
  • Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具