首页 > 编程语言 >C++ Allocator

C++ Allocator

时间:2023-04-09 09:55:17浏览次数:46  
标签:需要 allocator stl C++ 内存 类型 Allocator

C++ Allocator

该开始搞项目了,但是在搞项目之前,先搞一下C++的Allocator,因为项目中会用到。现在还不确定到底模仿哪个,jemalloc和tcmalloc,先看看吧。

1. 为什么需要Allocator

其实和new/delete是等价的,但是可以屏蔽一些底层细节,因为不一定所有平台都提供统一的内存分配方式,所以需要一个统一的接口,这个接口就是Allocator。在stl里面其实有大量使用。

另外allocator只是一片内存,而不是对象,所以需要配合construct和destroy来构造和析构对象。这个就解决了时间维度上的外部碎片。

过多的纠结为什么这个东西存在其实没啥意义。所以就不纠结了。

2. Allocator的接口

Allocator大概分为几个部分

  • 分配内存
  • 释放内存
  • 构造对象
  • 析构对象

每一步都有一个接口,这里就不一一列举了,可以参考stl的源码。

然后在我们实现allocator类的时候,需要实现这些接口,然后在自己的allocator中用。

3. 实现一个简单的Allocator

放链接:(tyallocator)[https://github.com/tiany7/tyallocator]

4. 一些问题

4.1 为什么需要rebind

因为在stl中,allocator是一个模板类,所以在使用的时候,需要指定一个类型,比如

std::vector<int, tyalloc::allocator<int>> v;

当使用Allocator为容器分配内存时,它可能需要为不同类型的元素分配不同大小的内存。rebind函数允许Allocator将自己转化为一个与给定类型相关的Allocator,以便为该类型的元素分配内存。rebind函数将Allocator类型参数转换为另一种类型参数,这个类型参数与需要分配内存的元素类型相同。这使得Allocator可以为不同类型的元素分配不同大小的内存,从而更好地支持STL容器的泛型性质。

4.2 为什么需要address和reference

address是返回一个指向对象的指针,reference是返回一个对象的引用。这两个函数是为了支持stl的迭代器,因为迭代器需要知道对象的地址和引用,也为移动等操作提供支持。

4.3 为什么需要const_iterator

因为stl的迭代器是支持const的,所以需要一个const_iterator。

4.4 为什么需要max_size

因为stl的容器需要知道最大的size,所以需要这个函数。

标签:需要,allocator,stl,C++,内存,类型,Allocator
From: https://www.cnblogs.com/tiany7/p/17299864.html

相关文章

  • 2023年第14届蓝桥杯大赛软件赛省赛 C/C++ 大学 B 组
    2023年第14届蓝桥杯大赛软件赛省赛C/C++大学B组试题A:日期统计(5)直接暴力,8个for+优化,2~5分钟跑完。答案:365点击查看代码#include<bits/stdc++.h>usingnamespacestd;typedeflonglongLL;constintN=1e6+10,INF=0x3f3f3f3f;intmon[]={0,31,28,......
  • C++函数重载和对象
    函数的默认参数intfun(inta,intb=10,intc=20){returna+b+c;}intmain(){cout<<fun(10)<<endl;//当参数有值时也可以输出正确,如果程序员加了返回值就用程序员加入的值。}形参的数据从左到右当中间有参数后面也需要定义一个函数和声明只能实现一个;占位参数voidfun(int*a,int......
  • 第十四届蓝桥杯大赛软件赛省赛C/C++大学生B组
    第十四届蓝桥杯大赛软件赛省赛C/C++大学生B组试题A:日期统计A题直接枚举即可,枚举日期,暴力匹配#include<iostream>#include<algorithm>#include<vector>usingnamespacestd;boolcheck(stringt){ if(t.substr(0,4)!="2023")returnfalse; stringmon=t.substr(4,2......
  • C++多核多线程同步实现
    使用MakefileC++11工程模拟dsp的多核同步逻辑,使用多线程模拟多核,多个线程通过C++11的条件变量实现同步。当某一线程执行到同步函数syn_func时,判断是否其他线程执行到此处了,若有其他线程没有执行到此处,本线程就应阻塞。当最后一个线程执行到同步函数时,通知所有线程解除阻塞,实现......
  • C++,OpenCV图像像素运算(6)
    参与算术运算图像的数据类型、通道数目、大小必须相同算术运算加法:addvoidadd(InputArraysrc1,InputArraysrc2,OutputArraydst,InputArraymask=noArray(),intdtype=-1);/******************************************************************** src1: 输入图1* ......
  • C++primer第五章
    5.1 简单语句表达式语句的作用是执行表达式并丢弃掉求值结果。最简单h的语句是空语句,空语句中只有一个单独的分号。复合语句是指用花括号括起来的语句和声明序列,复合语句也被称为块。一个块就是一个作用域。5.2 语句作用域定义在控制结构内的变量作......
  • C++ 并发编程实战 第二章 线程管控
    第二章线程管控std::thread简介构造和析构函数///默认构造///创建一个线程,什么也不做thread()noexcept;///带参构造///创建一个线程,以A为参数执行F函数template<classFn,class...Args>explicitthread(Fn&&F,Args&&...A);///拷贝构造(不可用)thread......
  • C++primer第四章表达式
    4.1 基础4.1.1 基本概念当一个对象作为右值时,用的是对象的值。当一个对象作为左值时,用的是对象的身份(在内存中的位置)。如果表达式的求值结果是左值,decltype作用于该表达式得到一个引用类型。4.1.2 优先级与结合律括号优先级比较高。在第四章结尾处附上了......
  • 2023年蓝桥杯软件类省赛 C/C++ B组 解析
    还有一题忘了题意是什么了,等拿到题面了再更中间的题目顺序也忘了,填空题的数据也暂时还没有,暂时只有简单的思路,包括后面大题数据范围和是否多组都有点记不清A将题面序列处理成数组放代码里直接枚举八个位置的\(O(n^8)\)复杂度对于\(n=100\)的范围显然本地跑也跑不出来但由......
  • CMU_15_445_project_0_C++_Primer
    CMU15_445project_0C++Primertask1Copy-On-WriteTrieGetGet比较简单,遍历字符串和trie,找得到就返回值,找不到就返回nullptr.Put每个树有一个没有value的根节点,节点的类型分为TrieNode类和TrieNodeWithValue类,TrieNode是基类不存value,TrieNodeWithValue类继......