一、前言
以下内容仅为理论,并未实践,考虑在现在的项目中实践或做一个测试的DEMO,见谅见谅。
但开了一个不错的思路???我绝对不是第一个想到这个理论的,只是我突然觉得它有改进的余地。
请不要再一般的环境中使用以下技术,对一般程序而言绝对没用,请在大量使用内存并希望可以通过预申请内存达到稳定的应用程序中使用以下理论。
二、选择库
我们常常有使用freelist的习惯,尤其在服务器端中使用内存预申请机制时一定会用到这种方式,首先我要推荐几种内存管理较好的类或库,比如:
1、boost.pool
为什么是pool而不是object_pool是因为pool本身的内存管理方式非常不错,最重要的是效率,具体的原理我就不阐述了,主要是object_pool在free的情况下效率极低,这个不信的大可以试试。
当然由于我们的项目是使用内存相当大的(3G~10G),所以在选择内存管理时进行了大量的工作,我在测试了众多的内存管理后还是选择了boost.pool。
2、原语freelist
具体实现目前网上没有,我是在一本书上看到的,但我测试过,效率很高(比boost.pool高出很多),但我做的测试不足,缺陷是跨平台方面需要实现的内容太多,由于项目较紧所以没有使用这套系统。
我使用的库并不是特别多,所以在这方面可能知道的比较少,见谅见谅,但我使用的库中认为最好的就是这2种,我们的目标其实很简单,轻量级并且效率很高,如果稍有效率降低的问题,即抛弃不用,依赖过多也抛弃不用,所以才有以上两种选择。
三、在工厂模式中使用内存池
在一般的情况下很难再工厂模式中使用预申请内存池,原因比较多,诸如预申请内存池多直接使用模板方式实现,存在对于子类大小适应的局限性,其次使用常规内存池又有内存池不会主动调用构造函数或析构函数的问题,那么如何自动化实现这一切呢?
我在这里选择boost.pool作为内存池的基础类,并实现内存池的几种思路,详细测试和改进将在未来给出。
以下代码为伪代码请勿直接使用:
class Go_Memory
{
public:
Go_Memory( int size );
~Go_Memory();
public:
type alloc( int size,class A );
type alloc( int size,class A,class B );
}
alloc函数负责分配类型为type的类指针给外部,并自动调用构造函数传入构造函数参数A,这是实现第一步,即通过内存池有效地分配内存给外部。
我建议建立专门的库来实现这种机制,但是发现其实我们无法自由的在工厂中实现它是么?
那么我们可以给Go_Memory实现几个点缀
第一,给Go_Memory加上单件模式
第二,实现自动化的宏去调用这种内存机制,这样在调用时只需要使用简单宏即可完成操作方便快捷
以下代码为伪代码请勿直接使用:
#define GO_NEW Go_Memory::instance()->alloc
#define GO_DELETE Go_Memory::instance()->free
当然这种实现方式的最大缺陷是,我们需要对这个内存管理机制花费很大的心血,因为我们要实现至少9中参数情况下的alloc同时无法像new operator 那样自由和全局调用,但可以在抽象工厂模式中使用这种内存管理机制,以达到自由灵活提升维护性并不失内存管理的本质。