C++学习笔记总结练习:内存分配器编程实现
内存分配器练习
C++内存分配器是用于管理程序运行时内存的工具。它负责分配和释放内存,以满足程序在运行过程中的动态内存需求。在C++中,有几种内存分配器可供选择,包括操作系统提供的默认分配器、自定义分配器和第三方库提供的分配器。
-
默认分配器:
默认情况下,C++使用操作系统提供的默认分配器来分配和释放内存。这些分配器通常是基于堆的,使用malloc()和free()等函数来分配和释放内存。默认分配器的优点是简单易用,但在某些情况下可能会存在性能问题。 -
自定义分配器:
C++允许开发人员自定义内存分配器,以满足特定的需求。通过重载new和delete运算符,可以实现自定义的内存分配和释放逻辑。自定义分配器可以根据应用程序的特点进行优化,例如使用内存池、缓存等技术来提高性能和效率。 -
第三方库提供的分配器:
除了默认分配器和自定义分配器,还有一些第三方库提供了高级的内存分配器。这些分配器通常具有更高的性能和更好的内存管理能力。例如,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内存分配器是用于管理程序运行时内存的工具。它负责分配和释放内存,以满足程序在运行过程中的动态内存需求。在C中,有几种内存分配器可供选择,包括操作系统提供的默认分配器、自定义分配器和第三方库提供的分配器。 默认分配…...
【uniapp】使用Vs Code开发uniapp:
文章目录 一、使用命令行创建uniapp项目:二、安装插件与配置:三、编译和运行:四、修改pinia: 一、使用命令行创建uniapp项目: 二、安装插件与配置: 三、编译和运行: 该项目下的dist》dev》mp-weixin文件导入微信开发者…...
【STM32】高效开发工具CubeMonitor快速上手
工欲善其事必先利其器。拥有一个辅助测试工具,能极大提高开发项目的效率。STM32CubeMonitor系列工具能够实时读取和呈现其变量,从而在运行时帮助微调和诊断STM32应用,类似于一个简单的示波器。它是一款基于流程的图形化编程工具,类…...
React 使用 i18n 翻译换行解决方法
当前问题: json 配置文件 "detail": {"10001": "Top 10 \nBIGGEST WINS" } 按以上方式文本在渲染的时候并不能识别我们加入 \n 要实现换行的意图,通过拆分成两个多语来实现又太低级。 解决方法: 在该多语…...
QEMU源码全解析37 —— Machine(7)
接前一篇文章:QEMU源码全解析36 —— Machine(6) 本文内容参考: 《趣谈Linux操作系统》 —— 刘超,极客时间 《QEMU/KVM》源码解析与应用 —— 李强,机械工业出版社 特此致谢! 上回书讲完了q…...
如何将阿里云WiredTiger引擎的MongoDB物理备份文件恢复至自建数据库
数据库操作一直是一个比较敏感的话题,动不动“删库跑路”,可见数据库操作对于一个项目而言是非常重要的,我们有时候会因为一个游戏的严重bug或者运营故障要回档数据库,而你们刚好使用的是阿里云的Mongodb,那么这篇文章…...
SAP FIORI Launchpad 403 forbidden error
问题: 在前台输入/N/UI2/FLP 浏览器显示 403 forbidden 查阅资料得知 相关sicf 的服务未激活 note:3011106 检查以下所有服务是否已在事务代码 SICF 中激活: /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(二进制JSON)数据模型,具有高度灵活性和可扩展性,被广泛…...
二、MySql库的操作
文章目录 一、库的操作(一)创建数据库(二)创建数据库案例(三)字符集和校验规则1、 查看系统默认字符集以及校验规则2、查看数据库支持的字符集3、查看数据库支持的字符集校验规则4、校验规则对数据库的影响…...
【ARM 嵌入式 编译系列 10 -- GCC 编译缩减可执行文件 elf 文件大小】
文章目录 GCC 如何缩减可执行文件size测试代码 上篇文章:ARM 嵌入式 编译系列 9-- GCC 编译符号表(Symbol Table)的详细介绍 下篇文章:ARM 嵌入式 编译系列 10.1 – GCC 编译缩减可执行文件 elf 文件大小 GCC 如何缩减可执行文件s…...
IDEA启动报错java.nio.charset.MalformedInputException: Input length=2
IDEA启动报错java.nio.charset.MalformedInputException: Input length2 问题解决后记 问题 原本系统运行好好得,一段时间没打开,再次打开重启 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手写笔推荐品牌
在现在的生活上,有了iPad平板,一切都变得简单了许多,也让我们的学习以及工作都更加的便利。这其中,电容笔就起到了很大的作用,很多人都不知道,到底要买什么牌子的电容笔?哪些电容笔的性价比比较…...
什么是数字化车间
一、数字化车间概述 数字化车间是以现代化信息、网络、数据库、自动识别等技术为基础,通过智能化、数字化、MES系统信息化等手段融合建设的数字化生产车间,精细地管理生产资源、生产设备和生产过程。随着工业4.0概念的提出,未来的工业和制造…...
创新零售,京东重新答题?
继新一轮组织架构调整后,京东从低价到下沉动作不断。 新成立的创新零售部在京东老将闫小兵的带领下悄然完成了整合。近日,京喜拼拼已改名为京东拼拼,与七鲜、前置仓等业务共同承载起京东线上线下加速融合的梦想。 同时,拼拼的更…...
面向对象设计与分析40讲(20)消息驱动编程和事件驱动编程模型
文章目录 消息驱动编程事件驱动编程消息驱动和事件驱动的区别 消息驱动编程 消息驱动是一种编程模型,它基于事件和消息的传递来驱动程序的执行流程。在消息驱动的模型中,系统中的各个组件(或对象)通过发送和接收消息进行通信和协…...
【c语言】指针进阶(超详细)
文章目录 ✈ 指向函数指针数组的指针📌指向函数指针数组的指针的定义📌指向函数指针数组的数组指针的使用 ✈回调函数📌 回调函数的定义📌 回调函数的使用 ✈qsort函数📌 qsort函数的作用📌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)
目录 动态规划怎么学? 1. 题目解析 2. 算法原理 1. 状态表示 2. 状态转移方程 3. 初始化 4. 填表顺序 5. 返回值 3. 代码编写 写在最后: 动态规划怎么学? 学习一个算法没有捷径,更何况是学习动态规划, 跟我…...
怎么做Tik Tok海外娱乐公会呢?新加坡市场怎么样?
一、为什么选择TikTok直播 1. 海外市场潜力巨大 • 自2016年始,多家直播平台陆续拓展至东南亚、中东、俄罗斯、日韩、欧美、拉美等地区。 • 海外市场作为直播发展新蓝海,2021年直播行业整申请cmxyci体规模达百亿美元,并维持高速增长。 &a…...
Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...
智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...
Linux简单的操作
ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...
《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...
ffmpeg(四):滤镜命令
FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...
安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)
船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...
