C++ 内存管理-对象池的设计与实现

本文介绍了C++中的对象池设计,对比了对象池与内存池的区别。对象池基类通过重载new/delete操作符,提供创建和释放对象的功能。文章详细讲解了对象池基类的模板设计,包括可变参数模板函数的使用,以及如何通过静态对象池实例进行内存管理。此外,还简要提到了对象池的实现和使用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

对象池与内存池的设计思路大体相同,如果我们的程序需要对一个类的对象进行大规模的申请和释放,用内存池也没有问题。但是由于内存池的内存块大小可能会与对象的大小不一致,从而导致内存块的碎片相对较多,因此通过构建一个对象池,对某个类的对象的内存申请和释放进行管理。

那么考虑一下对象池和内存池的区别?
1、对象池管理的是某个类的对象的内存管理,内存池管理的是内存块。
2、内存池重载了全局的new/delete操作符,对象池要在它想要管理的类中重载new/delete操作符。那么,为了避免在编写每个类的代码都要重载new/delete操作符,因此提供一个基类来重载new/delete操作符,所有想通过对象池管理的类要继承与这个基类。

对象池基类

这个基类的目的就是重载new/delete操作符,并提供静态的创建对象/释放对象的功能,替代了内存池设计的MemoryMgr管理类。

一个trick:可以看到,这是一个模板类,模板参数是继承这个基类的派生类类型。也就是说,当有一个派生类继承它的时候,要显示的告诉这个基类的模板参数。从而在createObject()接口中去创建对象。
另一个trick: 创建对象接口是一个模板函数,而且是一个可变参数的模板函数。因为这个基类并不知道继承它的类的构造函数会显示的调用几个参数。
第三个trick: 在这个基类中,构建了一个私有且静态的对象池类的对象(有点绕口),比如说CELLObjectPool是对象池类,那么我们在这个基类中,构建了一个静态的CELLObjectPool对象。通过这个对象调用对象池的分配和释放方法。同时,每个继承这个基类的类,都拥有一个对象池。

C++11的新特性–可变模版参数(variadic templates), 声明一个参数包T… args,这个参数包中可以包含0到任意个模板参数;0-任意个参数,就解决了不定参数这个问题。具体可见:https://www.cnblogs

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值