分配器allocator和new重载
3. 分配器allocator和new重载
- 3 分配器allocator和new重载
- 3.3 分配器allocator详解
- 3.4 自定义allocator
- 3.5 未初始化内存复制分析
3 分配器allocator和new重载
3.3 分配器allocator详解
分配器allocator实现容器算法时不同于new,它可以将对象内存分配和构造分离。
allocator的使用如下所示:
# include <iostream>
using namespace std;
class XData {public:XData() {cout << "construct function XData()" << endl;}~XData(){cout << "destory function ~XData()" << endl;}
};int main()
{/*** @brief * #include <memory>* std::allocator* address:C++17 弃用, C++20中移除* max_size:C++17 弃用, C++20中移除* construct:C++17 弃用, C++20中移除* destory:C++17 弃用, C++20中移除* allocator:分配未初始化的存储* deallocator:解分配存储*/allocator<XData> xdata_alloc;int size = 2;// 分配内存空间,不分配内存auto dataArr = xdata_alloc.allocate(size);for (size_t i = 0; i < size; i++){// allocator_traits 类模板提供访问分配器(Allocator)的各种属性的标准化方式。// 调用构造函数allocator_traits<decltype(xdata_alloc)>::construct(xdata_alloc, &dataArr[i]);// 调用析构函数allocator_traits<decltype(xdata_alloc)>::destroy(xdata_alloc, &dataArr[i]);}// 清理空间,不调用析构xdata_alloc.deallocate(dataArr, size);return 0;
}
3.4 自定义allocator
可以实现内存共享、内存泄漏探测,预分配对象存储和内存池
演示自定义vector和list分配器
#include <iostream>
#include <vector>
using namespace std;
class XData {public:XData() {cout << "construct function XData(), index = " << index << endl;}XData(const XData &b) { this->index = b.index;cout << "copy function XData(), index = " << index << endl;}~XData(){cout << "destory function ~XData()" << endl;}int index = 0;
};template<typename Ty>
class MyAllocator {public:using value_type = Ty;MyAllocator()=default;template<class other>MyAllocator(const MyAllocator<other> &) {};void deallocate(Ty *const ptr, const size_t count){free(ptr);}Ty *allocate(size_t count){cout << "allocate " << count << endl;return static_cast<Ty*>(malloc(sizeof(Ty) * count));}
};int main()
{vector<XData, MyAllocator<XData>> vec;XData d;d.index = 1;vec.push_back(d);d.index = 2;vec.push_back(d);d.index = 3;vec.push_back(d);return 0;
}
输出结果:
construct function XData(), index = 0
allocate 1
copy function XData(), index = 1
allocate 2
copy function XData(), index = 2
copy function XData(), index = 1
destory function ~XData()
allocate 4
copy function XData(), index = 3
copy function XData(), index = 1
copy function XData(), index = 2
destory function ~XData()
destory function ~XData()
destory function ~XData()
destory function ~XData()
destory function ~XData()
destory function ~XData()
3.5 未初始化内存复制分析
#include <iostream>
#include <vector>
#include <string.h>
using namespace std;
class XData {public:XData() {cout << "construct function XData(), index = " << index << endl;}XData(const XData &b) { this->index = b.index;cout << "copy function XData(), index = " << index << endl;}XData& operator=(const XData &d){this->index = d.index;cout << "operator= function XData(), index = " << index << endl;return *this;}~XData(){cout << "destory function ~XData()" << endl;}int index = 0;
};template<typename Ty>
class MyAllocator {public:using value_type = Ty;MyAllocator()=default;template<class other>MyAllocator(const MyAllocator<other> &) {};void deallocate(Ty *const ptr, const size_t count){free(ptr);}Ty *allocate(size_t count){cout << "allocate " << count << endl;return static_cast<Ty*>(malloc(sizeof(Ty) * count));}};int main()
{unsigned char buf[1024] = {0};XData datas[3];cout << "===============memcpy==================" << endl;memcpy(buf, &datas, sizeof(datas));cout << "===============std::copy==================" << endl;// 将对象进行赋值操作,对象没有做初始化copy(begin(datas), end(datas), reinterpret_cast<XData*>(buf));cout << "===============uninitialized_copy==================" << endl;// 将对象进行拷贝构造操作,对象做了初始化uninitialized_copy(begin(datas), end(datas), reinterpret_cast<XData*>(buf));return 0;
}
输出结果:
construct function XData(), index = 0
construct function XData(), index = 0
construct function XData(), index = 0
===============memcpy==================
===============std::copy==================
operator= function XData(), index = 0
operator= function XData(), index = 0
operator= function XData(), index = 0
===============uninitialized_copy==================
copy function XData(), index = 0
copy function XData(), index = 0
copy function XData(), index = 0
destory function ~XData()
destory function ~XData()
destory function ~XData()
#include <iostream>
#include <vector>
#include <string.h>
#include <memory>
using namespace std;
class XData {public:XData() {cout << "construct function XData(), index = " << index << endl;}XData(const XData &b) { this->index = b.index;cout << "copy function XData(), index = " << index << endl;}XData& operator=(const XData &d){this->index = d.index;cout << "operator= function XData(), index = " << index << endl;return *this;}~XData(){cout << "destory function ~XData()" << endl;}int index = 0;
};template<typename Ty>
class MyAllocator {public:using value_type = Ty;MyAllocator()=default;template<class other>MyAllocator(const MyAllocator<other> &) {};void deallocate(Ty *const ptr, const size_t count){free(ptr);}Ty *allocate(size_t count){cout << "allocate " << count << endl;return static_cast<Ty*>(malloc(sizeof(Ty) * count));}
};int main()
{// C++ 17 20// construct_at destory对象构造和销毁// C++17 destory对象的销毁// C++20 construct_at对象构造int size = 3;// 分配内存auto data = static_cast<XData*>(malloc(sizeof(XData) * size));for (size_t i = 0; i < size; i++){if (data) {std::construct_at(&data[i]); // 调用构造函数,构造对象}}// 调用析构函数destory(data, data + size);free(data);return 0;
}
分配器allocator和new重载相关推荐
- C++STL学习笔记(4) 分配器(Allocator)
在前面的博客<C++ STL学习笔记(3) 分配器Allocator,OOP, GP简单介绍>中,简单的介绍了分配器再STL的容器中所担当的角色,这一节对STL六大部件之一的分配器进行详细 ...
- C++: STL内存分配器--allocator
STL内存分配器--allocator 一.STL内存分配器 二.STL allocator 一.STL内存分配器 分配器(allocator))是C ++标准库的一个组件, 主要用来处理所有给定容器 ...
- STL源码:分配器 allocator
operator new() 和 malloc() operator new()就是调用malloc来申请内存空间 所有的分配内存操作最终都将落在 malloc 上.malloc分配的实际内存要比申请 ...
- C++ STL学习笔记(3) 分配器Allocator,OOP, GP简单介绍
继续学习侯捷老师的课程! 在前面的博客<C++ STL学习笔记(2) 容器结构与分类>中介绍了STL中常用到的容器以及他们的使用方法,在我们使用容器的时候,背后需要一个东西支持对内存的使用 ...
- c++11 动态内存管理-分配器 (std::allocator)
定义于头文件 <memory> template< class T >struct allocator; (1) template<>struct allocato ...
- 【C++内存管理侯捷】---学习笔记(下)malloc/free,loki allocator,other issue
第三讲 malloc/free 3.1 VC6和VC10的malloc比较 malloc/free是C层面的函数 源代码是来自于VC6.0:因为比较复杂,因此以图为主,辅以部分源代码,理解其运行机制: ...
- STL_空间配置器allocator
空间配置器 所有的STL的操作对象(所有的数值)都存放在容器内,而容器一定要配置空间才能存放资料 空间配置器的标准接口 typedef unsigned int size_t: allocator:: ...
- allocator详解
vector和内存池 最近看内存池有关的东西,又回顾了一下之前看C++ Primer时自己写的vector,发现只是对基本的Vector的成员函数进行了重写,最重要的地方也就是分配器用的都是默认的,所 ...
- CoreCLR源码探索(三) GC内存分配器的内部实现
在前一篇中我讲解了new是怎么工作的, 但是却一笔跳过了内存分配相关的部分. 在这一篇中我将详细讲解GC内存分配器的内部实现. 在看这一篇之前请必须先看完微软BOTR文档中的"Garbage ...
最新文章
- 蓝桥杯_算法训练_最小乘积(基本型)
- 超越竞争(2) 价值创新
- beetl 页面标签_Beetl 2.9.0 发布,修改 HTML 标签的渲染机制
- 【Elasticsearch】腾讯Elasticsearch海量规模背后的内核优化剖析
- 全国医疗机构勒索病毒事件公告:阿里云发布公益行动
- 微信小程序腾讯云实时语音转写
- php程序 导出表格文件后缀,PHPExcel生成Excel文件---提示导出文件或者文件扩展名不一致,或导出的文件或文件扩展名无效...
- velodyne VLP-16线三维雷达在ros使用
- 2019年9月总结,10月展望
- SVN revert 命令使用手册
- 关于MPU6050陀螺仪模块的测量误差分析
- 【Java】数组Array(概念、相关语法、相关算法)
- 常用PHP编辑器下载
- 机械硬盘中的LMR、PMR、CMR、SMR的定义和关系
- DFIG虚拟惯性控制+下垂控制的系统一次调频的simulink模型
- uni-app -- 授权获取个人信息-登录注册流程
- 百度地图开发者账号申请
- 百度AI图像处理(V3版本)—人脸识别(人脸对比)调用教程(基于Python3-附Demo)
- 如何判断页面是通过PC端还是移动端访问?
- 教你用PS快速制作图章,你也可以拥有专属于自己的图章
热门文章
- 出现Python OSError: [Errno 22] Invalid argument的来龙去脉
- (java毕业设计)基于java新闻发布管理系统源码
- 电脑内存太大,用不完怎么办?开发成虚拟内存给电脑加速
- 毕业了,我是先择业,还是先就业?
- 【106短信群发为什么会被拦截】
- 2008最新全套毕业设计(计算机/通讯/电子/自动化)
- 以开放与融合为杀手锏:天翼空间与天翼宽带
- C# 弹出USB外接硬盘(U盘)
- Excel催化剂开源第47波-Excel与PowerBIDeskTop互通互联之第一篇
- 数据分析入门系列教程-常用图表