繁体   English   中英

每个类类型的静态内存池对象

[英]Static memory pool object per Class type

我正在尝试为C ++中的类设计基于内存池的分配。目前,我有以下运算符重载:

class Foo{

    public:
     Foo(){}

     void* operator new(size_t nbytes, Pool& pool)
     {

         return    pool.alloc(nbytes);
     }

     void operator delete(void* p)
    {

         pool->dealloc(p);   

   }

};

现在,我不想将Pool对象作为参数传递给new。此外,我还必须以某种方式引用它,以便dtor在调用它时从其分配。我想到了在类声明之前将Pool初始化为静态:

   class Foo{

     static boost::pool<> pool ;
     public:
     Foo()
     {

     }

     void* operator new(size_t nbytes)
     {

         return    pool.alloc(nbytes);
     }

     void operator delete(void* p)
    {

         pool.dealloc(p);   

    }


 };

在.cpp中:

    boost::pool<> Foo::pool(sizeof(Foo)) ;//preallocates N * sizeof(Foo) bytes

这是正确的方法吗?是否会在创建Foo的第一个实例之前始终构造“池”?

更新:

这种方法行不通。开始创建Foo时,池似乎没有分配的内存。

在类中声明为static的对象基本上是带有有趣名称的全局对象。 全局对象的规则是,它们将以未指定的顺序在main开始之前创建,并在main结束之后销毁。 唯一的保证是,如果特定的编译单元(即.cpp文件)有两个全局对象AB并且A出现在B之前,那么A将在B之前构造。

因此,如果您没有Foo任何全局实例,则一切正常,否则,您将遇到问题。

常见的解决方案是使用静态函数返回对本地静态对象的引用,而不是使用全局对象,即

class Foo {
    static Pool& pool() {
        static Pool p;
        return p;
    }
    ...
};

这解决了这个问题,因为将在第一次调用该函数时构造函数内部的静态对象。 在这种情况下,您只需要注意多线程(即,如果存在两个线程同时进入静态函数的风险)。

使用C ++ 11,甚至没有线程成为问题,因为保证了初始化可以安全地工作(如果两个线程同时调用该函数,则一个线程将等待另一个线程完成单例的初始化)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM