Posted on 2005-11-03 14:17 Panic 阅读(1408)
评论(0) 编辑 收藏
一个池代理模板代码
作者: Panic 2005年11月3日
简介:在内部维护池(默认是在堆上),在栈空间创建代理对象的同时,在池中生成被代理的实际对象。
两者拥有相同的生存周期,并且可以获取相同的值语义。
PoolAgent模板类的用途有两个,
1,是使用池减少频繁的内存分配和释放,
2,池对象映射为栈对象。保留原先的创建语法和生存周期。
由于程序调用栈有限,在栈上构造大型对象往往会引起栈溢出,而频繁new/delete容易引起内存碎片。
使用这个模板的目的就是避免以上情况的发生。默认情况下,每个代理对象只占据4字节的栈空间。
这个模板也支持构造超过最大栈空间的对象。
推荐使用的数据类型: 以值语义使用的非数组自定义类型。
推荐使用的场合:
1,递归算法,创建较大的栈对象。
2,需要频繁申请和释放的短生存周期,但大尺寸的变量。
3,容易造成内存碎片的工程,
禁止使用的场合:
1,数组。
2,非值类型对象。例如引用,指针等。
3,全局,或者静态变量。
4,小型对象(本模板会对每个对象造成默认8字节的额外开销,太小的对象会引起内存浪费)
5,工厂模式等间接创建的对象。
6,多线程。请自己修改代码以实现多线程安全。
总的原则是,可以在栈上直接创建的对象,除数组外,大多都能直接使用本模板。
源代码和测试代码下载:
http://blog.vckbase.com/Files/Panic/PoolAgent.rar
公共接口说明:
namespace Panic
{
template<typename value_type,typename size_type = size_t,typename buffer_type = char>
class PoolAgent
{
public:
//存取被代理对象的函数。
value_type & ref(); //获取引用
value_type * ptr(); //获取指针
const value_type &c_ref() const; //获取const引用
const value_type * c_ptr() const; //获取const指针
value_type val() const; //获取值
//重载operator =(),这个是为了让PoolAgent具有值语义。
PoolAgent & operator = ( const PoolAgent& other);
//以下是构造函数模板列表,用来适应不同参数个数的类型,这里只写出4个,用户可以根据需要扩充。
template<typename param>
explicit PoolAgent(param p);
template<typename param1,typename param2>
explicit PoolAgent(param1 p1,param2 p2);
template<typename param1,typename param2,typename param3>
explicit PoolAgent(param1 p1,param2 p2,param3 p3);
template<typename param1,typename param2,typename param3,typename param4>
explicit PoolAgent(param1 p1,param2 p2,param3 p3,param4 p4);
};
};