2

相互に通信するために特定のオブジェクトを割り当てるいくつかの異なるオブジェクトがあり、フラグを設定するだけでノードをフリーとしてタグ付けできる、ローカルで管理されるメモリ プールをそれぞれに与えることにしました。

アイデアは次のとおりです。

struct cat {/**couple data fields*/};

struct rat
{
    rat() : poolIndex_(0), poolSize_(INITIAL_SIZE), pool_(new cat *[poolSize_])
        {
            for (size_t i = 0; i < poolSize_; ++i)
                pool_[i] = new cat;
        }

    size_t poolIndex_;
    size_t poolSize_;
    cat** pool_;
};

と彼の友人が空きノードratを使い果たしたときにプールのサイズを変更するための非メンバー関数を提供します (ノードの配布は を介し​​て行われます)。非メンバー関数は次のとおりです。catpoolIndex_++ % poolSize_;

void quadruplePool(cat*** pool, size_t& poolIndex, size_t& poolSize)
{
    poolIndex = poolSize;
    cat** tmp = new cat *[poolSize*4];
    for (size_t i = 0; i < poolSize; ++i)
        tmp[i] = (*pool)[i];
    delete[] (*pool);
    (*pool) = tmp;
    poolSize = poolSize*4;
    for (size_t i = poolIndex; i < poolSize; ++i)
        (*pool)[i] = new cat;
}

私が今持っているものから私にスピードアップを与えることができるコードに何かがありますか? (速度は私にとって非常に重要です)

4

1 に答える 1

1

cats の配列割り当てを行い、それらが解放されたら、それらをフリー リストに配置する方がはるかに効率的だと思います。

struct CatPool {
    size_t poolSize_;
    size_t i_;
    cat *pool_;
    cat *free_;
    typedef std::unique_ptr<cat[]> PoolPtr;
    std::list<PoolPtr> cleanup_;

    CatPool (size_t pool_size) : poolSize_(pool_size), free_(0) { grow(); }

    void grow () {
        i_ = 0;
        pool_ = new cat[poolSize_];
        cleanup_.push_back(PoolPtr(pool_));
    }

    cat * get () {
        cat *c = free_;
        if (c) {
            free_ = free_->next_;
            return c;
        }
        for (;;) {
            if (i_ < poolSize_) return &pool_[i_++];
            grow();
        }
    }

    void put (cat *c) {
        c->next_ = free_;
        free_ = c;
    }
};

ただし、既存のプール アロケーターの実装を使用することを検討する必要があります。たとえば、Boost のobject_pool.

于 2012-07-07T04:06:19.533 に答える