C++ 有没有更快的方法或优化我的临时内存池?

C++ 有没有更快的方法或优化我的临时内存池?,c++,memory-management,C++,Memory Management,我有两个不同的对象,它们分配某些对象来相互通信,我决定给它们各自一个本地管理的内存池,在这个内存池中,一个节点只需在其中设置一个标志就可以标记为空闲 这个想法是这样的: struct cat {/**couple data fields*/}; struct rat { rat() : poolIndex_(0), poolSize_(INITIAL_SIZE), pool_(new cat *[poolSize_]) { for (size_t

我有两个不同的对象,它们分配某些对象来相互通信,我决定给它们各自一个本地管理的内存池,在这个内存池中,一个节点只需在其中设置一个标志就可以标记为空闲

这个想法是这样的:

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

代码中有没有什么东西可以让我现在的速度加快?(速度对我来说是至关重要的)

我认为对
cat
s进行数组分配要有效得多,当它们被释放时,将它们放在空闲列表中

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;
    }
};
struct-CatPool{
大小\u t池大小\u;
大小;
猫*游泳池;
无猫;
typedef std::unique_ptr PoolPtr;
std::列表清理;
CatPool(size_t pool_size):poolSize(pool_size),free(0){grow();}
空增长(){
i=0;
pool_uux=新猫[poolSize_uuux];
清理。推回(池ptr(池));
}
猫*get(){
cat*c=自由度;
如果(c){
自由\自由\下一步;
返回c;
}
对于(;;){
if(i_u下一步=自由;
自由=c;
}
};

但是,您应该考虑使用现有的池分配器实现。例如,Boost的

object\u pool

嗯,有几件事。1) 多久分配一次?2) 如果您不知道每秒分配多少次,请分析代码。3) 您可能想尝试SLAB allocation()。我使用的是一个非常类似的分配器,但我的对象表示执行路径上的某种检查点,甚至可以跳转到另一个线程。它们分配一些元数据cat节点,其他节点不断将其附加到(下一个指针)上,并在生产者-消费者队列中传递。只有在最后它才被“释放”…将全局cat池替换为给每个检查点my above(在调整到流之前只增长一到两次)给了我速度增益,因为他们循环%大小和自由就像:catnode->isFree=true;不过我可以试一试…@PalaceChan:这个池实现的效率很大程度上取决于
cat
是否有东西需要构建和销毁。如果您可以在从
数组分配时惰性地初始化每个
cat
,则
grow
操作会更便宜。
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;
    }
};