【原创】LevelDB中的placement new
刚才看Leveldb源码的时候,看到leveldb为了避免频繁的new/delete操作, 使用了Arena缓存 ,在缓存上面分配空间以后,使用 placement new 进行初始化
详见 SkipList<Key,Comparator>::NewNode(const Key& key, int height)中的
return new (mem) Node(key);
placement new 技术使c++中new的 分配空间 和 调用构造函数 这两个功能分开 ,只是在固定的地址调用构造函数。
这个技术有利于程序员自己实现一个自己的缓存堆的功能:每次初始化一个对象都可以在一个固定的地方
关于placement new 可以参看以下网页 :
C++ Placement New
http://hubeihuyanwei.blog.163.com/blog/static/28205284201171722359640/
如何让new操作符不分配内存,只调用构造函数
http://blog.csdn.net/weiqubo/article/details/4540773
placement new的作用就是:创建对象但是不分配内存,而是在已有的内存块上面创建对象。
用于需要反复创建并删除的对象上,可以降低分配释放内存的性能消耗。
#include <iostream>
#include <new>
const intchunk = 16;
class Foo
{
public :
int val( ) { return _val; }
Foo( ) { _val = 0; }
private :
int_val;
};
//预分配内存,但没有Foo对象
char*buf = new char[ sizeof(Foo) * chunk ];
int
main( void )
{
//在buf中创建一个Foo对象
Foo*pb = new (buf) Foo;
//检查一个对象是否被放在buf中
if ( pb->val() == 0 )
{
cout <<"new expressio worked!" <<endl;
}
//到这里不能再使用pb
delete[] buf;
return 0;
}
注意:最后delete的是buf ,而不是pb