![](/img/trans.png)
[英]Do static members of a class occupy memory if no object of that class is created?
[英]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文件)有两个全局对象A
和B
并且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.