109 C++ STL 分配器概述,使用,工作原理说明 非重点。

news2024/11/16 21:23:58

一。分配器allocator概述

分配器 (allocator) 是C++ STL库的基石之一,它是一种策略模式,允许用户将内存管理从容器中解耦出来,进行更具体化的操作。通过使用 allocator,我们可以自定义内存的分配和释放方式,从而可以更好地控制内存的使用。

分配器的使用和容器使用 紧密关联。

一般都是使用缺省的分配器

确切的叫做 内存分配器。扮演内存池的角色,但是不一定和内存池的技术一样,猜想一般通过大量减少对malloc()的调用,来节省内存,甚至还有效率的提高。

为何使用allocator


在C++中,内存的申请和释放是一个昂贵的操作,频繁的申请和释放可能导致系统的内存碎片,使程序性能下降。通过使用allocator,我们可以自定义内存的申请和释放方式,减少系统的内存碎片,提高程序的性能。

此外,allocator还有一个重要的作用,那就是将对象的构造和内存的申请分开。在传统的内存申请方式中,我们在申请内存的同时就会调用对象的构造函数,但有时候,我们可能只是想申请内存,而不想立即构造对象,这时候,就可以使用allocator。

二。分配器的使用

在C++ STL中,allocator是一个模板类,我们可以通过为它提供一个类型参数来创建一个特定类型的allocator。以下是一个基本的例子:

 
#include <memory>

int main() {
	std::allocator<int> alloc; // 创建一个分配int的allocator
	int* p = alloc.allocate(10); // 分配10个int的空间

	// 使用未构造的内存
	for (int i = 0; i < 10; ++i) {
		alloc.construct(p + i, i); // 在分配的内存上构造对象
	}

	// 销毁对象并释放内存
	for (int i = 0; i < 10; ++i) {
		alloc.destroy(p + i); // 销毁对象
	}
	alloc.deallocate(p, 10); // 释放内存
	return 0;
}

三。自定义分配器

C++ STL库的灵活性主要源于其策略模式的设计,分配器就是这种设计的一个重要应用。通过自定义分配器,我们可以实现一些特殊的内存管理策略,比如内存共享、内存泄漏探测,预分配对象存储、内存池等。

3.1 自定义分配器的应用场景


以下列出了一些自定义分配器的应用场景:

内存共享:对于多进程或者多线程应用,我们可能需要共享内存空间。自定义分配器可以使我们将对象存储在共享内存中。

内存泄漏探测:在复杂的应用中,内存泄漏可能是一个难以定位的问题。自定义分配器可以帮助我们追踪内存的分配和释放,从而检测内存泄漏。

预分配对象存储:对于一些知道内存需求的应用,预先分配内存可以避免频繁的内存分配和释放,提高性能。

内存池:对于频繁分配和释放小块内存的应用,使用内存池可以减少内存碎片,提高性能。

3.2 自定义分配器的实现


一个自定义分配器需要实现以下几个接口:

typedef:为使用的类型定义别名
allocate(n):分配能容纳n个对象的内存
deallocate(p, n):释放前面分配的内存
construct(p, val):在指针p所指向的内存上构造一个对象,其值为val
destroy(p):销毁指针p所指向的对象

template <class T>
class MyAllocator {
public:
	typedef T value_type;

	MyAllocator() = default;
	template <class U> constexpr MyAllocator(const MyAllocator<U>&) noexcept {}

	T* allocate(std::size_t n) {
		// 你的内存分配策略
	}

	void deallocate(T* p, std::size_t) noexcept {
		// 你的内存释放策略
	}

	template<typename... Args>
	void construct(T* p, Args&&... args) {
		// 你的对象构造策略
	}

	void destroy(T* p) {
		// 你的对象销毁策略
	}
};

template <class T, class U>
bool operator==(const MyAllocator<T>&, const MyAllocator<U>&) { return true; }

template <class T, class U>
bool operator!=(const MyAllocator<T>&, const MyAllocator<U>&) { return false; }

3.3 自定义分配器的使用

自定义分配器可以用于STL中的任何容器,包括vector、list等。以下是一个使用自定义分配器的vector的例子

#include <vector>
#include "MyAllocator.h" // 包含你的自定义分配器的头文件

int main() {
    std::vector<int, MyAllocator<int>> vec; // 使用自定义分配器的vector
    vec.push_back(1);
    vec.push_back(2);
    vec.push_back(3);
    return 0;
}

在这个例子中,我们创建了一个使用MyAllocatorstd::vector。因此,这个vector的内存管理策略将由我们的MyAllocator来决定。同样的方法也可以应用于std::list或其他STL容器。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1435823.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Springboot 整合 Elasticsearch(二):使用HTTP请求来操作ES

&#x1f4c1;前情提要&#xff1a;Springboot整合Elasticsearch&#xff08;一&#xff09;&#xff1a;Linux下安装 Elasticsearch 8.x 上回说到&#xff0c;Elasticsearch 已经安装完成&#xff0c;不过我们使用7.17.5 版本继续后文&#xff1a; 一、使用 elasticsearch-hea…

【网站项目】037物流管理系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

Matlab:利用1D-CNN(一维卷积神经网络),分析高光谱曲线数据或时序数据

1DCNN 简介&#xff1a; 1D-CNN&#xff08;一维卷积神经网络&#xff09;是一种特殊类型的卷积神经网络&#xff0c;设计用于处理一维序列数据。这种网络结构通常由多个卷积层和池化层交替组成&#xff0c;最后使用全连接层将提取的特征映射到输出。 以下是1D-CNN的主要组成…

Mac最实用的日常快捷键,最方便快捷的Mac使用技巧合集

今天小编给大家分享一下这几年来使用Mac过程中的各种小技巧。&#xff0c;大家不用担心&#xff0c;下面的各种小技巧在apple其他各型号电脑中几乎也是都是通用的&#xff0c;话不多说&#xff0c;下面开始&#xff01; 屏幕相关 &#xff08;1&#xff09;截屏 ctrlshift3 截…

jsp商场会员卡管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 商场会员卡管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5.…

计组学习笔记2024/2/5

1. 2. 3. 1.这么多步,才完成第一条指令,通过0索引来找到2 2.PC的值是对应着MAR来的,为了更好地找到地址 3.操作码, 地址码这些东西都是放在存储体里面的 MAR和MDR只是一个中转站 MAR对应着拿到各个部件给出的主存地址 MDR对应着拿到各个部件给出的指令 4.取指令完成后就自…

2024Node.js零基础教程(小白友好型),nodejs新手到高手,(五)NodeJS入门——http模块

044_http模块_创建HTTP服务端 hello&#xff0c;大家好&#xff0c;那这个小节我们来使用 nodejs 创建一个 http 的服务&#xff0c;有了这个 http 服务之后&#xff0c;我们就可以处理浏览器所发送过来的请求&#xff0c;并且还可以给这个浏览器返回响应。 顺便说一下&#x…

数据分析基础之《pandas(5)—文件读取与存储》

一、概述 1、我们的数据大部分存在于文件当中&#xff0c;所以pandas会支持复杂的IO操作&#xff0c;pandas的API支持众多文件格式&#xff0c;如CSV、SQL、XLS、JSON、HDF5 二、CSV 1、读取csv文件 read_csv(filepath_or_buffer, sep,, delimiterNone) 说明&#xff1a; fi…

<.Net>使用visual Studio 2022在VB.net中新添自定义画图函数(优化版)

前言 这是基于我之前的一篇博文&#xff1a; 使用visual Studio 2019在VB.net中新添自定义画图函数 在此基础上&#xff0c;我优化了一下&#xff0c;改进了UI&#xff0c;添加了示例功能&#xff0c;即以画圆函数为基础&#xff0c;添加了走马灯功能。 先看一下最终效果&#…

在线JSON解析格式化工具

在线JSON解析格式化工具 - BTool在线工具软件&#xff0c;为开发者提供方便。JSON在线可视化工具:提供JSON视图,JSON格式化视图,JSON可视化,JSON美化,JSON美化视图,JSON在线美化,JSON结构化,JSON格式化,JSON中文Unicode等等。以清晰美观的结构化视图来展示json,可伸缩折叠展示,…

【Linux】Linux权限(下)

Hello everybody!在上一篇文章中&#xff0c;权限讲了大部分内容。今天继续介绍权限剩下的内容&#xff0c;希望大家看过这篇文章后都能有所收获&#xff01; 1.更改文件的拥有者和所属组 对于普通用户&#xff0c;文件的拥有者和所属组都无权修改。 、 、 但root可以修改文件…

071:vue中过滤器filters的使用方法(图文示例)

第071个 查看专栏目录: VUE ------ element UI 专栏目标 在vue和element UI联合技术栈的操控下&#xff0c;本专栏提供行之有效的源代码示例和信息点介绍&#xff0c;做到灵活运用。 提供vue2的一些基本操作&#xff1a;安装、引用&#xff0c;模板使用&#xff0c;computed&a…

双侧条形图绘制教程

写在前面 双侧条形图在我们的文章中也是比较常见的&#xff0c;那么这样的图形是如何绘制的呢&#xff1f; 以及它使用的数据类型是什么呢&#xff1f; 这些都是我们在绘制图形前需要掌握的&#xff0c;至少我们知道绘图的数据集如何准备&#xff0c;这样才踏出第一步。 今天…

Unity接入GVoice腾讯实时语音

Unity接入GVoice腾讯实时语音 一、介绍二、注册GVoice创建项目语音服务1.创建项目2.申请语音权限3.项目管理查看SDK初始化的一些参数和基本信息4.GVoice检测 三、SDK下载SDK是分为两种类型&#xff1a;独立版集成板 SDK放入Unity工程中 四、语音代码写法五、GVoice踩坑语音权限…

知到如何找答案?这7款足够解决问题 #笔记#其他

在这个信息爆炸的时代&#xff0c;合理利用学习工具可以帮助我们过滤和获取有用的知识。 1.网易公开课 这是一个可以帮你找到国内外演讲课程的学习APP&#xff0c;提供了多个专业的视频课程&#xff0c;而且还有丰富的TED、精品国外英语纪录片等。 其中涵盖的大学专业课程包…

ClickHouse基于数据分析常用函数

文章标题 一、WITH语法-定义变量1.1 定义变量1.2 调用函数1.3 子查询 二、GROUP BY子句&#xff08;结合WITH ROLLUP、CUBE、TOTALS&#xff09;三、FORM语法3.1表函数3.1.1 file3.1.2 numbers3.1.3 mysql3.1.4 hdfs 四、ARRAY JOIN语法&#xff08;区别于arrayJoin(arr)函数&a…

Java开发IntelliJ IDEA2023

IntelliJ IDEA 2023是一款强大的集成开发环境&#xff08;IDE&#xff09;&#xff0c;专为Java开发人员设计。它提供了许多特色功能&#xff0c;帮助开发人员更高效地编写、测试和调试Java应用程序。以下是一些IntelliJ IDEA 2023的特色功能&#xff1a; 智能代码编辑器&…

在 MacOS 上虚拟化 x86Linux 的最佳方法(通过 Rosetta)

categories: [VM] tags: MacOS VM 写在前面 买了 ARM 的 mac, 就注定了要折腾一下虚拟机了… 之前写过一篇文章是通过 utm 虚拟化archlinux, 其实本质上还是调用了 qemu-system-x86_64, 所以速度并不快, 后来想着能不能借用 Rosetta 的优势即原生转译, 来虚拟化 Intel 的 Linu…

idea开发工具的简单使用与常见问题

1、配置git 选择左上角目录file->setting 打开&#xff0c;Version Control 目录下Git&#xff0c;选择git安装目录下的git.exe文件&#xff1b; 点击test&#xff0c;出现git版本&#xff0c;则表示git识别成功&#xff0c;点击右下角确认即可生效。 2、配置node.js 选…

C++ 哈希+unordered_map+unordered_set+位图+布隆过滤器(深度剖析)

文章目录 1. 前言2. unordered 系列关联式容器2.1 unordered_map2.1.1 unordered_map 的概念2.1.2 unordered_map 的使用 2.2 unordered_set2.2.1 unordered_set 的概念2.2.2 unordered_set 的使用 3. 底层结构3.1 哈希的概念3.2 哈希冲突3.3 哈希函数3.4 哈希冲突的解决3.4.1 …