首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >支持外部实例创建的ObjectPool

支持外部实例创建的ObjectPool
EN

Stack Overflow用户
提问于 2013-01-30 11:36:25
回答 1查看 82关注 0票数 0

我尝试修改现有的对象池类,以便能够将实例创建者类作为参数传递给对象池。基本上,我希望能够将实际的对象构造排除在内存池之外,以便在创建要池化的实例的方式上有更大的自由度。

以下是对象池定义:

代码语言:javascript
复制
template < 
    typename T, 
    typename InstanceCreator = DefaultInstanceFactory<T>
>
class ObjectPool : private noncopyable {
...
}

因此,我将创建如下所示的ObjectPool

代码语言:javascript
复制
ObjectPool<int> intPool((DefaultInstanceFactory<int>()));

代码语言:javascript
复制
ObjectPool<IntClass, IntClass::InstanceFactory> intPool (IntClass::InstanceFactory (1));

默认实例创建者如下所示

代码语言:javascript
复制
template <typename T>
class DefaultInstanceFactory {
public:
    T * operator ()() const {
        return new T;
    }
};

在ObjectPool类内部是一个存储项的嵌套类

代码语言:javascript
复制
class PooledItem {
public:
    char data[OBJECT_SIZE];
    PooledItem * next;
    bool initialized;

    PooledItem() 
    : initialized(false) {}

    ~PooledItem() { 
        // --- call T destructor
        if (initialized) 
            cast()->~T(); 
    }
    T * cast() { 
        return reinterpret_cast<T *>(data); 
    };
};

有一个获取对象的borrowObject方法,这是我的实际问题:

代码语言:javascript
复制
T * borrowObject() {
    PooledItem * item = getItem();
    T * obj = item->cast();
    if (! item->initialized) {
        // old original line, call the defaut constructor of T
        new (obj) T();
        // how to integrate the external Instance Creator at this point?
        //new (instCreator_ ()) T(1);
        //instCreator_ ();
        item->initialized = true;
    }

    if (obj == NULL) {
        throw ObjectPoolException(
            "Object is NULL!", __FILE__, __LINE__, __FUNCTION__);
    }

    return obj;
}

在上面的方法中,我标记了实际的问题行。我不知道如何用外部实例创建器替换放置新的new (obj) T()行,从而重用该内存。

为了完整起见,将对象返回到池的方法如下所示

代码语言:javascript
复制
void returnObject(T * obj) {
    // --- Get containing PooledItem pointer
    PooledItem * item = reinterpret_cast<PooledItem *>(obj);
    // --- Make sure object came from this pool
    if (item->next != reinterpret_cast<PooledItem *>(this)) {
        // throw Exception
    }

    // --- Destroy object now if we want to reconstruct it later
    if (destroyOnRelease) {
        item->cast()->~T();
        item->initialized = false;
    }

谁能给我一些帮助,如何修改这些方法,以便正确集成外部实例创建器?到目前为止,我还不知道是否需要在returnObject方法中更改一些东西,到目前为止,我认为不需要。

感谢您的帮助!

EN

回答 1

Stack Overflow用户

发布于 2013-03-05 15:24:30

听起来您需要更改InstanceFactory的签名以获取指针

代码语言:javascript
复制
template <typename T>
class DefaultInstanceFactory {
public:
  void operator ()(T* out) const {
      return new(out) T;
  }
};
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14596254

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档