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重载相关推荐

  1. C++STL学习笔记(4) 分配器(Allocator)

    在前面的博客<C++ STL学习笔记(3) 分配器Allocator,OOP, GP简单介绍>中,简单的介绍了分配器再STL的容器中所担当的角色,这一节对STL六大部件之一的分配器进行详细 ...

  2. C++: STL内存分配器--allocator

    STL内存分配器--allocator 一.STL内存分配器 二.STL allocator 一.STL内存分配器 分配器(allocator))是C ++标准库的一个组件, 主要用来处理所有给定容器 ...

  3. STL源码:分配器 allocator

    operator new() 和 malloc() operator new()就是调用malloc来申请内存空间 所有的分配内存操作最终都将落在 malloc 上.malloc分配的实际内存要比申请 ...

  4. C++ STL学习笔记(3) 分配器Allocator,OOP, GP简单介绍

    继续学习侯捷老师的课程! 在前面的博客<C++ STL学习笔记(2) 容器结构与分类>中介绍了STL中常用到的容器以及他们的使用方法,在我们使用容器的时候,背后需要一个东西支持对内存的使用 ...

  5. c++11 动态内存管理-分配器 (std::allocator)

    定义于头文件 <memory> template< class T >struct allocator; (1) template<>struct allocato ...

  6. 【C++内存管理侯捷】---学习笔记(下)malloc/free,loki allocator,other issue

    第三讲 malloc/free 3.1 VC6和VC10的malloc比较 malloc/free是C层面的函数 源代码是来自于VC6.0:因为比较复杂,因此以图为主,辅以部分源代码,理解其运行机制: ...

  7. STL_空间配置器allocator

    空间配置器 所有的STL的操作对象(所有的数值)都存放在容器内,而容器一定要配置空间才能存放资料 空间配置器的标准接口 typedef unsigned int size_t: allocator:: ...

  8. allocator详解

    vector和内存池 最近看内存池有关的东西,又回顾了一下之前看C++ Primer时自己写的vector,发现只是对基本的Vector的成员函数进行了重写,最重要的地方也就是分配器用的都是默认的,所 ...

  9. CoreCLR源码探索(三) GC内存分配器的内部实现

    在前一篇中我讲解了new是怎么工作的, 但是却一笔跳过了内存分配相关的部分. 在这一篇中我将详细讲解GC内存分配器的内部实现. 在看这一篇之前请必须先看完微软BOTR文档中的"Garbage ...

最新文章

  1. 蓝桥杯_算法训练_最小乘积(基本型)
  2. 超越竞争(2) 价值创新
  3. beetl 页面标签_Beetl 2.9.0 发布,修改 HTML 标签的渲染机制
  4. 【Elasticsearch】腾讯Elasticsearch海量规模背后的内核优化剖析
  5. 全国医疗机构勒索病毒事件公告:阿里云发布公益行动
  6. 微信小程序腾讯云实时语音转写
  7. php程序 导出表格文件后缀,PHPExcel生成Excel文件---提示导出文件或者文件扩展名不一致,或导出的文件或文件扩展名无效...
  8. velodyne VLP-16线三维雷达在ros使用
  9. 2019年9月总结,10月展望
  10. SVN revert 命令使用手册
  11. 关于MPU6050陀螺仪模块的测量误差分析
  12. 【Java】数组Array(概念、相关语法、相关算法)
  13. 常用PHP编辑器下载
  14. 机械硬盘中的LMR、PMR、CMR、SMR的定义和关系
  15. DFIG虚拟惯性控制+下垂控制的系统一次调频的simulink模型
  16. uni-app -- 授权获取个人信息-登录注册流程
  17. 百度地图开发者账号申请
  18. 百度AI图像处理(V3版本)—人脸识别(人脸对比)调用教程(基于Python3-附Demo)
  19. 如何判断页面是通过PC端还是移动端访问?
  20. 教你用PS快速制作图章,你也可以拥有专属于自己的图章

热门文章

  1. 出现Python OSError: [Errno 22] Invalid argument的来龙去脉
  2. (java毕业设计)基于java新闻发布管理系统源码
  3. 电脑内存太大,用不完怎么办?开发成虚拟内存给电脑加速
  4. 毕业了,我是先择业,还是先就业?
  5. 【106短信群发为什么会被拦截】
  6. 2008最新全套毕业设计(计算机/通讯/电子/自动化)
  7. 以开放与融合为杀手锏:天翼空间与天翼宽带
  8. C# 弹出USB外接硬盘(U盘)
  9. Excel催化剂开源第47波-Excel与PowerBIDeskTop互通互联之第一篇
  10. 数据分析入门系列教程-常用图表