Panic的小屋

国破山河在,城春草木深。
随笔 - 151, 评论 - 1225, 引用 - 20, 文章 - 0

导航

公告

<2008年8月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
31123456

留言簿(249)

随笔分类

随笔档案

文章档案

相册

国外好站推荐

工具网页

我的其他网页

我的网友

户外运动

美女的空间

搜索

最新评论

阅读排行榜

评论排行榜

一个池代理模板代码

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);
    };
};

标题  
姓名  
主页
验证码 *
内容   
  登录  使用高级评论  Top
[使用Ctrl+Enter键可以直接提交]