参考原文地址:(原创) 一个超级对象池的实现
我对文章的格式和错别字进行了调整,并补充标注出了重要的部分,代码也增加了详细注释。以下是正文。
正文
对象池对于创建开销比较大的对象来说很有意义,为了避免重复创建开销比较大的对象,我们可以通过对象池来优化。
对象池的思路比较简单,事先创建好一批对象,放到一个集合中,以后每当程序需要新的对象时候,都从对象池里获取,每当程序用完该对象后,都把该对象归还给对象池。这样会避免重复的对象创建,提高程序性能。
先来看看对象池的简单实现:
简单对象池的实现
1 | cpp复制代码#include <list> |
这个 object pool 的实现很典型,初始创建一定数量的对象,取的时候就直接从池子中取,用完之后再回收到池子。一般的对象池的实现思路和这个类似,这种实现方式虽然能达到目的,但是存在以下不足:
- 对象池
ObjectPool<T>
只能容纳特定类型的对象,不能容纳所有类型的对象,无法支持重载的和参数不同的构造函数; - 对象用完之后需要手动回收,用起来不够方便,更大的问题是存在忘记回收的风险;
我希望能有一个更强大的对象池,这个对象池能容纳所有的对象,还能自动回收用完了对象,不需要手动回收,用起来更方便。要实现这样的对象池需要解决前面提到的两个问题,通过 C++11 就可以解决这两个问题。
- 对于问题 1 :容纳所有的对象。本质上需要将对象池中的对象类型擦除,这里用 Any 类型就可以解决。
- 对于问题 2 :自动回收用完的对象。这里用智能指针就可以解决,在创建智能指针时可以指定删除器,在删除器中不删除对象,而是回收到对象池中,而这个过程对外界来说是看不见的,由智能指针自己完成。
关于 Any 的实现见我前面的博客内容:C++11 打造好用的 Any 。
下面来看看超级对象池的具体实现吧。
超级对象池的实现
1 | cpp复制代码#include <string> |
测试代码:
1 | cpp复制代码struct AT |
本文转载自: 掘金