对象池

转载 2012年03月26日 16:38:26


smartpoint


#ifndef __SMART_POINTER_H__
#define __SMART_POINTER_H__

template <class T>
class SmartPointer
{
public:
    typedef T element_type;

    SmartPointer ():_object(NULL), _counter(NULL){}
    SmartPointer(T * object):_object(NULL), _counter(NULL){ Assign(object); }
    SmartPointer(const SmartPointer& sp):_object(NULL), _counter(NULL){ Assign(sp); }
    SmartPointer& operator=(T * object) { Assign(object); return *this; }
    SmartPointer& operator=(const SmartPointer& sp) { Assign(sp); return *this; }
    
    ~SmartPointer() { if (_counter) RemRef(); }
    
    bool operator == (const SmartPointer& sp) { assert(_object != NULL); return ( Get() == sp.Get()); }
    bool operator != (const SmartPointer& sp) { assert(_object != NULL); return ( Get() != sp.Get()); }
    bool operator < (const SmartPointer& sp)  { assert(_object != NULL); return ( Get() > sp.Get()); }
    bool operator()(){ return (_object != NULL); }
    bool operator!() { return (_object == NULL); }
    
    T* operator ->() { assert(_object != NULL); return _object; }
    T& operator * () { assert(_object != NULL); return *_object; }
    const T* operator->() const { assert(_object != NULL); return _object; }
    const T& operator *() const { assert(_object != NULL); return *_object; }
        
    T* Get() const { return _object; }
    int GetCounter() const { return _counter ? *_counter : 0 ?}
    bool Unique() const { return _counter ? (*_counter == 1) : false;}
    
    void Reset(T* object = NULL)
    {
        Assign(object);
    }
    
protected:
    void Assign(T* object)
    {
        if ( _object )
        {
            RemRef();
        }
        
        if ( object )
        {
            try
            {
                _counter = new int;
                AddRef();
            }
            catch ( ... )
            {
                delete object;
                object = NULL;
            }
            
            _object = object;
        }
    }
    
    void Assign(const SmartPointer& sp)
    {
        T* object = sp._object;
        if ( _object != object )
        {
            if ( _counter )
            {
                RemRef();
            }
            _counter = sp._counter;
            _object = sp._object;
            AddRef();
        }
    }
    
    void RemRef()
    {
        assert(_object);
        assert(_counter);
        
        if ( *_counter > 0 && --*_counter == 0 )
        {
            delete _object;
            delete _counter;
        }
        
        _object = NULL;
        _counter = NULL;
    }
    
    void AddRef()
    {
        assert(_counter);
        *_counter++;
    }

private:
    T*      _object;
    int*    _counter;
};



#endif//__SMART_POINTER_H__



一个简单的Java对象池实现——可用来解决SimpleDateFormat的线程安全问题

被SimpleDateFormat的线程安全问题困扰过的人应该不止我一个吧。为了比秒这个类的线程安全,通常我们会有以下两种做法: 每次都new 一个SimpleDateFormat对象,但频繁的创建与...
  • nmgrd
  • nmgrd
  • 2016年06月17日 17:55
  • 1866

Unity3D之对象池(Object Pool)

其实从原文标题可以看出,这是一系列文章中的第三篇,前两篇讲解了从C#语言本身优化内存和Unity3D Profiler的使用,都很精彩,有兴趣的童鞋可以参考一下。第三篇写了对象池的实现,从简单到难。 ...
  • qq563129582
  • qq563129582
  • 2016年12月18日 22:05
  • 534

Unity3d 单例对象池

原创 单例模式 初学者很容易搞晕,为啥有2种写法,这里顺带着写一下,不是本章的要点。 首先,是继承自MonoBehaviour的单例,需要使用U3D组件和功能可以用这种单例。理解U3D本身单例...
  • u012322710
  • u012322710
  • 2016年11月18日 23:07
  • 1632

Android中对象池的使用

对象池的使用 在Android开发中经常会发现当日志中出现大量GC时我们的应用常常出现卡顿。这是因为当虚拟机进行垃圾回收操作时应用所有线程都会暂停,完成后恢复。如果出现大量GC操作时主线程频繁暂停就...
  • zuochunsheng
  • zuochunsheng
  • 2017年02月11日 10:28
  • 381

对象池技术

Apache的commons-pool提供了编写对象池的API,将用完的对象返回对象池中以便于下次利用,从而减少了对象创建时间。这对于创建对象相对耗时的应用来说,能够提高应用的性能。  comm...
  • nanmuling
  • nanmuling
  • 2014年07月16日 16:40
  • 712

Unity3D对象池的理解与小例子

最近在学习Unity3D,在制作一个跑酷Demo的时候,发现不停的初始化障碍物和删除障碍物比较卡,后来研究了一下对象池,整了大半天,总算是明白了。现在记录下来,希望能帮助和我一样的新手,如果有不对的地...
  • Tomato2313
  • Tomato2313
  • 2016年10月29日 10:25
  • 2537

关于unity对象池的用法

当游戏中需要发射子弹(gameobject)等操作的时候,不停的Instantiate和destroy就会很耗性能,如果又是多人游戏,那多人同时Instantiate和destroy子弹,配置不高的设...
  • liuleitheone
  • liuleitheone
  • 2016年08月04日 10:22
  • 3302

Cocos2dx对象池的一个实现

// // ObjectPool.h // DragonBall // // Created by user on 13-8-22. // // #ifndef __DragonBall__O...
  • ym19860303
  • ym19860303
  • 2013年08月23日 16:49
  • 3425

对象池的优劣

对象池的优点: 复用池中对象, 没有分配内存和创建堆中对象的开销, 没有释放内存和销毁堆中对象的开销, 进而减少垃圾收集器的负担, 避免内存抖动; 不必重复初始化对象状态, 对于比较耗时的constr...
  • kslinabc
  • kslinabc
  • 2016年03月08日 12:38
  • 3568

用C#建立通用对象池[2]

 创建一个接口,用于限定对象池中所保存的对象的基本行为:          public interfac...
  • guanzhongs
  • guanzhongs
  • 2006年03月23日 22:54
  • 3242
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:对象池
举报原因:
原因补充:

(最多只允许输入30个字)