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

网站制作哪些分类北京网站建设w亿玛酷1订制

网站制作哪些分类,北京网站建设w亿玛酷1订制,长沙优化网站哪家公司好,景安 怎么把网站做别名目录 一、定长池的框架 二、如何脱离malloc的内存池,直接从堆拿空间? 三、如何设计内存块的指针? 四、代码框架及实现 五、性能测试 一、定长池的框架 在学习高并发内存池之前,我们先来实现一个定长池&#xff0…

目录

一、定长池的框架      

二、如何脱离malloc的内存池,直接从堆拿空间?

三、如何设计内存块的指针?

四、代码框架及实现

五、性能测试


一、定长池的框架      

       在学习高并发内存池之前,我们先来实现一个定长池,他对于我们后面的内存池具有启发意义。定长池也叫对象池,只能存储一个类型的对象,因为该类型的对象大小肯定也是一样的,所有也叫定长池。

        作为程序员(C/C++)我们知道申请内存使用的是malloc,malloc其实就是一个通用的大众货,什么场景下都可以用,但是什么场景下都可以用就意味着什么场景下都不会有很高的性能,下面我们就先来设计一个定长内存池做个开胃菜,当然这个定长内存池在我们后面的高并发内存池中也是有价值的,所以学习他目的有两层,先熟悉一下简单内存池是如何控制的,第二他会作为我们后面内存池的一个基础组件。

 上面这一幅图就是不同的场景需要使用不同的对象,我们用不同的内存池俩存储对象们,而非使用malloc,这样就减少了内存碎片,所谓术业有专攻正是如此。

        当我们申请空间的时候,直接从堆中申请一大块内存,由我们自己维护,如果要释放一个个的小内存块,则是把内存块挂起到_freelist中,这样以后再需要申请内存块则直接从_freelist中拿,不用再找系统的堆中拿了,从而提高了效率。

二、如何脱离malloc的内存池,直接从堆拿空间?

        我们知道malloc的底层实际上是调用了brk和mmap等系统调用的(在linux情况下),而且malloc底层是自己维护了一个通用内存池,那么我们只需要跳过malloc,直接调用系统调用就能脱离malloc的内存池了。

        在Windows环境中,我们使用的是和brk类似的接口。

//参数:要k页,一页是4096个字节
inline static void* SystemAlloc(size_t kpage)
{
#ifdef _WIN32void* ptr = VirtualAlloc(0, kpage * (1 << 12), MEM_COMMIT | MEM_RESERVE,PAGE_READWRITE);
#else// linux下brk mmap等
#endifif (ptr == nullptr)throw std::bad_alloc();return ptr;
}

三、如何设计内存块的指针?

        在学习链表的时候,我们通常会把链表的节点设计成两个部分,一个存放下一个节点的地址的指针,剩下一个才是存放数据的空间。

        但是在这里,我们并不采取上述做法,因为每一个链表节点都要存储指针的话,会让链表节点变大,由于我们上层应用并不需要遍历链表等操作,所以我们直接让链表指针使用内存块结构的前4/8个字节(取决于你的操作系统是32还是64位的),在上层申请空间的时候,返回该点。        

        这样该节点的所有空间都能用于存储数据,而delete之后,由于数据不在被需要,可以直接覆盖式的在前4/8个字节写上下一个内存块节点的指针。

所以如何获取一块空间的前4/8个字节呢?

四、代码框架及实现

(1)当自由链表有空间的时候,优先从自由链表中拿。

(2)当自由链表没有空间的时候,从memory中拿。

(3)当memory中没有空间的时候,才需要调用系统调用从堆中拿空间。

(4)如果一个对象的大小小于指针大小,则无法存储下一个节点的地址,所以一个节点最小4/8个字节。

template<class T>
class ObjectPool
{
public:T* New();void Delete(T* obj);private:char* _memory=nullptr;void* _freelist=nullptr;size_t _remainByte=0;
};
template<class T>
T* ObjectPool<T>::New()
{T* obj = nullptr;//1.从freelist中拿if (_freelist!=nullptr){void* next = *((void**)_freelist);obj = (T*)_freelist;_freelist = next;}else{//3.如果memory没有/不够,从系统调用brk拿if (_remainByte < sizeof(T)){_remainByte = 128 * 1024;_memory = (char*)SystemAlloc(_remainByte>>12);//_memory = (char*)malloc(128 * 1024);if (_memory == nullptr){throw std::bad_alloc();}}//2.如果freelist没有,从memory拿obj = (T*)_memory;size_t objSize = sizeof(T) < sizeof(void*) ? sizeof(void*) : sizeof(T);_memory += objSize;_remainByte -= objSize;}//初始化对象//定位new,显式调用构造函数new(obj)T;return obj;
}template<class T>
void ObjectPool<T>::Delete(T* obj)
{//显式调用析构函数obj->~T();//头插不用考虑是否为空链表*(void**)obj = _freelist;_freelist = obj;
}

五、性能测试

        在这里我们构建了一个树型节点,当做对象。每一次申请释放该对象N次,一个使用c++的关键字new,另外一个使用我们ObjectPool中的new()成员函数,观察运行时间。

struct TreeNode
{int _val;TreeNode* _left;TreeNode* _right;TreeNode():_val(0), _left(nullptr), _right(nullptr){}
};
void TestObjectPool()
{// 申请释放的轮次const size_t Rounds = 3;// 每轮申请释放多少次const size_t N = 1000000;size_t begin1 = clock();std::vector<TreeNode*> v1;v1.reserve(N);for (size_t j = 0; j < Rounds; ++j){for (int i = 0; i < N; ++i){v1.push_back(new TreeNode);}for (int i = 0; i < N; ++i){delete v1[i];}v1.clear();}size_t end1 = clock();ObjectPool<TreeNode> TNPool;size_t begin2 = clock();std::vector<TreeNode*> v2;v2.reserve(N);for (size_t j = 0; j < Rounds; ++j) {for (int i = 0; i < N; ++i){v2.push_back(TNPool.New());}for (int i = 0; i < N; ++i){TNPool.Delete(v2[i]);}v2.clear();}size_t end2 = clock();cout << "new cost time:" << end1 - begin1 << endl;cout << "object pool cost time:" << end2 - begin2 << endl;
}

可以看到,效率明显比直接使用new关键字要高许多。

http://www.dtcms.com/wzjs/801933.html

相关文章:

  • 闵行网站开发定制app软件开发
  • 成都购物网站建设杭州网站建设专家
  • 如何搭建wordpress泉州网络seo
  • 静态网站开发工具有哪些wordpress修改文章阅读量
  • 简单网站设计搜索引擎优化的简写是
  • 网站离线浏览器 怎么做湖南送变电建设公司 网站
  • 医院网站建设 价格低淮南网云小镇房价
  • 网站设计与管理方向网站建设面试表
  • 承德北京网站建设重庆重庆网站建设
  • 如何做自己的淘客网站有创意的婚纱网站模板下载
  • 网站制作容易吗大良外贸网站设计
  • 玉田网站设计公司wap建站工具
  • 我国外贸网站的建设重庆网站策划
  • 网站做专业团队在线网站生成器
  • 大丰做网站找哪家好做淘宝联盟网站要多少钱
  • 做网站的技术岗位有哪些网络热词缩写
  • 电商网站建设制作济南做网站的公司有哪些
  • 试玩网站建设电子商务网站建设模板下载
  • 成都网站建设四川冠辰网站建设网站排名优化原理
  • 网站建设单位wordpress仿微信
  • 自己做的网站显示iis7零基础月做网站多久
  • 苏州网站制作好的公司建设工程抗震应当坚持的原则有
  • 如何拍做美食的视频网站石景山网站建设有哪些公司
  • 移动网站建设初学视频教程中国移动网站官网
  • 网站建设的基本流程规范wordpress博客软件
  • 专业做美食视频的网站重庆智能网站建设公司
  • 如何做直播网站成都网站建设怎么样
  • 企业网站快速备案服务西青做网站公司
  • 网站建设框架怎么写英文网站google推广
  • 贵阳建设工程信息网站网站域名不要了怎么做