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

C++学习笔记总结练习:内存分配器编程实现

内存分配器练习

C++内存分配器是用于管理程序运行时内存的工具。它负责分配和释放内存,以满足程序在运行过程中的动态内存需求。在C++中,有几种内存分配器可供选择,包括操作系统提供的默认分配器、自定义分配器和第三方库提供的分配器。

  1. 默认分配器:
    默认情况下,C++使用操作系统提供的默认分配器来分配和释放内存。这些分配器通常是基于堆的,使用malloc()和free()等函数来分配和释放内存。默认分配器的优点是简单易用,但在某些情况下可能会存在性能问题。

  2. 自定义分配器:
    C++允许开发人员自定义内存分配器,以满足特定的需求。通过重载new和delete运算符,可以实现自定义的内存分配和释放逻辑。自定义分配器可以根据应用程序的特点进行优化,例如使用内存池、缓存等技术来提高性能和效率。

  3. 第三方库提供的分配器:
    除了默认分配器和自定义分配器,还有一些第三方库提供了高级的内存分配器。这些分配器通常具有更高的性能和更好的内存管理能力。例如,Google的tcmalloc、Facebook的jemalloc等都是常用的第三方内存分配器。

在使用内存分配器时,需要注意以下几点:

  • 内存泄漏:确保在不再使用内存时及时释放,避免内存泄漏问题。
  • 内存碎片:频繁的内存分配和释放可能导致内存碎片问题,影响程序性能。可以使用内存池、缓存等技术来减少内存碎片。
  • 多线程安全:如果程序涉及多线程操作,需要确保内存分配器的线程安全性,避免竞争条件和数据损坏。
  • 性能优化:根据应用程序的特点和需求,选择合适的内存分配器以提高性能和效率。

总结起来,C++内存分配器是用于管理程序运行时内存的工具。开发人员可以使用默认分配器、自定义分配器或第三方库提供的分配器来满足程序的内存需求。在使用内存分配器时,需要注意内存泄漏、内存碎片、多线程安全和性能优化等问题。

#ifndef __JJALLOC__
#define __JJALLOC__
#endif
#include<new> // for placement new
#include<iostream> //for cerr
#include<cstddef>  //for ptrdiff_t
#include<cstdlib> // for exit()
#include<climits> // for UINT_MAX
namespace my{// 申请内存空间。调用operator new 。// T*参数是为了注册模板类型Ttemplate<class T>inline T* _allocate(ptrdiff_t size, T*){//set_new_handler(0);T* tmp = (T*)(::operator new)((size_t)(size * sizeof(T)));if (tmp == 0){std::cerr << "out of memory" << std::endl;}return tmp;}// 释放内存空间。调用operator deletetemplate<class T>inline void _deallocate(T* buffer){::operator delete(buffer);}// 创建内存对象。调用placement newtemplate<class T1,class T2>inline void _construct(T1 *p, const T2 &value){new (p)T1(value);}// 通过查询了解到这个操作叫做placement new,就是在指针p所指向的内存空间创建一个T1类型的对象,但是对象的内容是从T2类型的对象转换过来的(调用了T1的构造函数,T1::T1(value))。// 就是在已有空间的基础上重新调整分配的空间,类似于realloc函数。这个操作就是把已有的空间当成一个缓冲区来使用,这样子就减少了分配空间所耗费的时间,因为直接用new操作符分配内存的话,在堆中查找足够大的剩余空间速度是比较慢的。// 释放内存对象。调用析构函数。template<class T>inline void _destroy(T* ptr){ptr->~T();}template <class T>class allocate{public:typedef T value_type;typedef T* pointer;typedef const T* const_pointer;typedef T& reference;typedef const T& const_reference;typedef size_t size_type;typedef ptrdiff_t difference_type;// template<class U>// struct rebind{//     typedef allocator<U> other;// };pointer alloc(size_type n, const void * hint = 0){return _allocate((difference_type)n, (pointer)0);}void deallocate(pointer p, size_type n){_deallocate(p);}void construct(pointer p, const_reference value){return _construct(p, value);}void destroy(pointer p){_destroy(p);}pointer address(reference x){return (pointer)&x;}pointer const_address(const_reference x){return (const_pointer)&x;}size_type max_size()const{return (size_type)(UINT_MAX / sizeof(T));}};
}
#include<iostream>
using namespace std;
int main(){my::allocate<int> al;int * ptr = al.alloc(10);cout<<"alloc:"<<*ptr<<"\t"<<*(ptr+1)<<endl;al.construct(ptr,123);cout<<"construct:"<<*ptr<<"\t"<<*(ptr+1)<<endl;al.destroy(ptr);cout<<"destroy:"<<*ptr<<"\t"<<*(ptr+1)<<endl;al.deallocate(ptr,100);cout<<"deallocate:"<<*ptr<<"\t"<<*(ptr+1)<<endl;int size = al.max_size();cout<<"size:"<<size<<endl;int* b=new int[3];cout<<*b<<endl;new (b)int(999);cout<<*b<<endl;cout<<*(b+1)<<endl;
}

相关文章:

C++学习笔记总结练习:内存分配器编程实现

内存分配器练习 C内存分配器是用于管理程序运行时内存的工具。它负责分配和释放内存&#xff0c;以满足程序在运行过程中的动态内存需求。在C中&#xff0c;有几种内存分配器可供选择&#xff0c;包括操作系统提供的默认分配器、自定义分配器和第三方库提供的分配器。 默认分配…...

【uniapp】使用Vs Code开发uniapp:

文章目录 一、使用命令行创建uniapp项目&#xff1a;二、安装插件与配置&#xff1a;三、编译和运行:四、修改pinia&#xff1a; 一、使用命令行创建uniapp项目&#xff1a; 二、安装插件与配置&#xff1a; 三、编译和运行: 该项目下的dist》dev》mp-weixin文件导入微信开发者…...

【STM32】高效开发工具CubeMonitor快速上手

工欲善其事必先利其器。拥有一个辅助测试工具&#xff0c;能极大提高开发项目的效率。STM32CubeMonitor系列工具能够实时读取和呈现其变量&#xff0c;从而在运行时帮助微调和诊断STM32应用&#xff0c;类似于一个简单的示波器。它是一款基于流程的图形化编程工具&#xff0c;类…...

React 使用 i18n 翻译换行解决方法

当前问题&#xff1a; json 配置文件 "detail": {"10001": "Top 10 \nBIGGEST WINS" } 按以上方式文本在渲染的时候并不能识别我们加入 \n 要实现换行的意图&#xff0c;通过拆分成两个多语来实现又太低级。 解决方法&#xff1a; 在该多语…...

QEMU源码全解析37 —— Machine(7)

接前一篇文章&#xff1a;QEMU源码全解析36 —— Machine&#xff08;6&#xff09; 本文内容参考&#xff1a; 《趣谈Linux操作系统》 —— 刘超&#xff0c;极客时间 《QEMU/KVM》源码解析与应用 —— 李强&#xff0c;机械工业出版社 特此致谢&#xff01; 上回书讲完了q…...

如何将阿里云WiredTiger引擎的MongoDB物理备份文件恢复至自建数据库

数据库操作一直是一个比较敏感的话题&#xff0c;动不动“删库跑路”&#xff0c;可见数据库操作对于一个项目而言是非常重要的&#xff0c;我们有时候会因为一个游戏的严重bug或者运营故障要回档数据库&#xff0c;而你们刚好使用的是阿里云的Mongodb&#xff0c;那么这篇文章…...

SAP FIORI Launchpad 403 forbidden error

问题&#xff1a; 在前台输入/N/UI2/FLP 浏览器显示 403 forbidden 查阅资料得知 相关sicf 的服务未激活 note:3011106 检查以下所有服务是否已在事务代码 SICF 中激活&#xff1a; /default_host/sap/bc/ui2/nwbc/ /default_host/sap/bc/ui2/start_up /default_host/sap…...

【MongoDB】高性能非关系型数据库

文章目录 基本介绍MongoDB和redis做比较MongoDB 在Java中的使用MongoDB的应用场景 基本介绍 MongoDB是一个开源的、面向文档的NoSQL数据库管理系统。它采用了类似JSON的BSON&#xff08;二进制JSON&#xff09;数据模型&#xff0c;具有高度灵活性和可扩展性&#xff0c;被广泛…...

二、MySql库的操作

文章目录 一、库的操作&#xff08;一&#xff09;创建数据库&#xff08;二&#xff09;创建数据库案例&#xff08;三&#xff09;字符集和校验规则1、 查看系统默认字符集以及校验规则2、查看数据库支持的字符集3、查看数据库支持的字符集校验规则4、校验规则对数据库的影响…...

【ARM 嵌入式 编译系列 10 -- GCC 编译缩减可执行文件 elf 文件大小】

文章目录 GCC 如何缩减可执行文件size测试代码 上篇文章&#xff1a;ARM 嵌入式 编译系列 9-- GCC 编译符号表&#xff08;Symbol Table&#xff09;的详细介绍 下篇文章&#xff1a;ARM 嵌入式 编译系列 10.1 – GCC 编译缩减可执行文件 elf 文件大小 GCC 如何缩减可执行文件s…...

IDEA启动报错java.nio.charset.MalformedInputException: Input length=2

IDEA启动报错java.nio.charset.MalformedInputException: Input length2 问题解决后记 问题 原本系统运行好好得&#xff0c;一段时间没打开&#xff0c;再次打开重启 IDEA启动报错java.nio.charset.MalformedInputException: Input length2。 解决 百度了 https://blog.csd…...

【Vue-Router】路由传参

1. query 传参 list.json {"data": [{"name": "面","price":300,"id": 1},{"name": "水","price":400,"id": 2},{"name": "菜","price":500,"…...

平板选择什么电容笔比较好?ipad手写笔推荐品牌

在现在的生活上&#xff0c;有了iPad平板&#xff0c;一切都变得简单了许多&#xff0c;也让我们的学习以及工作都更加的便利。这其中&#xff0c;电容笔就起到了很大的作用&#xff0c;很多人都不知道&#xff0c;到底要买什么牌子的电容笔&#xff1f;哪些电容笔的性价比比较…...

什么是数字化车间

一、数字化车间概述 数字化车间是以现代化信息、网络、数据库、自动识别等技术为基础&#xff0c;通过智能化、数字化、MES系统信息化等手段融合建设的数字化生产车间&#xff0c;精细地管理生产资源、生产设备和生产过程。随着工业4.0概念的提出&#xff0c;未来的工业和制造…...

创新零售,京东重新答题?

继新一轮组织架构调整后&#xff0c;京东从低价到下沉动作不断。 新成立的创新零售部在京东老将闫小兵的带领下悄然完成了整合。近日&#xff0c;京喜拼拼已改名为京东拼拼&#xff0c;与七鲜、前置仓等业务共同承载起京东线上线下加速融合的梦想。 同时&#xff0c;拼拼的更…...

面向对象设计与分析40讲(20)消息驱动编程和事件驱动编程模型

文章目录 消息驱动编程事件驱动编程消息驱动和事件驱动的区别 消息驱动编程 消息驱动是一种编程模型&#xff0c;它基于事件和消息的传递来驱动程序的执行流程。在消息驱动的模型中&#xff0c;系统中的各个组件&#xff08;或对象&#xff09;通过发送和接收消息进行通信和协…...

【c语言】指针进阶(超详细)

文章目录 ✈ 指向函数指针数组的指针&#x1f4cc;指向函数指针数组的指针的定义&#x1f4cc;指向函数指针数组的数组指针的使用 ✈回调函数&#x1f4cc; 回调函数的定义&#x1f4cc; 回调函数的使用 ✈qsort函数&#x1f4cc; qsort函数的作用&#x1f4cc;qsort函数的定义…...

C++入门篇8---vector

vecctor是动态顺序表 一、了解vector的相关接口及其功能 1.构造函数相关接口 函数声明功能介绍vector()无参构造vector(size_type n,const value_type& valvalue_type())构造并初始化n个valvector(const value& x)拷贝构造vector(InputIterator first, InputIterato…...

【学会动态规划】最大子数组和(19)

目录 动态规划怎么学&#xff1f; 1. 题目解析 2. 算法原理 1. 状态表示 2. 状态转移方程 3. 初始化 4. 填表顺序 5. 返回值 3. 代码编写 写在最后&#xff1a; 动态规划怎么学&#xff1f; 学习一个算法没有捷径&#xff0c;更何况是学习动态规划&#xff0c; 跟我…...

怎么做Tik Tok海外娱乐公会呢?新加坡市场怎么样?

一、为什么选择TikTok直播 1. 海外市场潜力巨大 • 自2016年始&#xff0c;多家直播平台陆续拓展至东南亚、中东、俄罗斯、日韩、欧美、拉美等地区。 • 海外市场作为直播发展新蓝海&#xff0c;2021年直播行业整申请cmxyci体规模达百亿美元&#xff0c;并维持高速增长。 &a…...

后进先出(LIFO)详解

LIFO 是 Last In, First Out 的缩写&#xff0c;中文译为后进先出。这是一种数据结构的工作原则&#xff0c;类似于一摞盘子或一叠书本&#xff1a; 最后放进去的元素最先出来 -想象往筒状容器里放盘子&#xff1a; &#xff08;1&#xff09;你放进的最后一个盘子&#xff08…...

基于算法竞赛的c++编程(28)结构体的进阶应用

结构体的嵌套与复杂数据组织 在C中&#xff0c;结构体可以嵌套使用&#xff0c;形成更复杂的数据结构。例如&#xff0c;可以通过嵌套结构体描述多层级数据关系&#xff1a; struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

网络六边形受到攻击

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 抽象 现代智能交通系统 &#xff08;ITS&#xff09; 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 &#xff08;…...

《Playwright:微软的自动化测试工具详解》

Playwright 简介:声明内容来自网络&#xff0c;将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具&#xff0c;支持 Chrome、Firefox、Safari 等主流浏览器&#xff0c;提供多语言 API&#xff08;Python、JavaScript、Java、.NET&#xff09;。它的特点包括&a…...

浅谈不同二分算法的查找情况

二分算法原理比较简单&#xff0c;但是实际的算法模板却有很多&#xff0c;这一切都源于二分查找问题中的复杂情况和二分算法的边界处理&#xff0c;以下是博主对一些二分算法查找的情况分析。 需要说明的是&#xff0c;以下二分算法都是基于有序序列为升序有序的情况&#xf…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)

上一章用到了V2 的概念&#xff0c;其实 Fiori当中还有 V4&#xff0c;咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务)&#xff0c;代理中间件&#xff08;ui5-middleware-simpleproxy&#xff09;-CSDN博客…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)

在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马&#xff08;服务器方面的&#xff09;的原理&#xff0c;连接&#xff0c;以及各种木马及连接工具的分享 文件木马&#xff1a;https://w…...

Linux离线(zip方式)安装docker

目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1&#xff1a;修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本&#xff1a;CentOS 7 64位 内核版本&#xff1a;3.10.0 相关命令&#xff1a; uname -rcat /etc/os-rele…...

JVM虚拟机:内存结构、垃圾回收、性能优化

1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...