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.大小和距离的类型:如何表示内存块的大小和指针间的距离?

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

代码展示

cpp 复制代码
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>; };};

需实现函数

cpp 复制代码
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 内存中。

相关推荐
tianyuanwo16 小时前
Rust开发完全指南:从入门到与Python高效融合
开发语言·python·rust
ShineWinsu17 小时前
对于数据结构:堆的超详细保姆级解析—上
数据结构·c++·算法·计算机·二叉树·顺序表·
im_AMBER17 小时前
Leetcode 46
c语言·c++·笔记·学习·算法·leetcode
民乐团扒谱机17 小时前
脉冲在克尔效应下的频谱展宽仿真:原理与 MATLAB 实现
开发语言·matlab·光电·非线性光学·克尔效应
yuan1999717 小时前
基于扩展卡尔曼滤波的电池荷电状态估算的MATLAB实现
开发语言·matlab
Tony Bai17 小时前
Go GUI 开发的“绝境”与“破局”:2025 年现状与展望
开发语言·后端·golang
豆浆whisky17 小时前
Go分布式追踪实战:从理论到OpenTelemetry集成|Go语言进阶(15)
开发语言·分布式·golang
2401_8604947017 小时前
Rust语言高级技巧 - RefCell 是另外一个提供了内部可变性的类型,Cell 类型没办法制造出直接指向内部数据的指针,为什么RefCell可以呢?
开发语言·rust·制造
Tony Bai17 小时前
【Go模块构建与依赖管理】08 深入 Go Module Proxy 协议
开发语言·后端·golang
浪裡遊17 小时前
Next.js路由系统
开发语言·前端·javascript·react.js·node.js·js