【原创】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

posted on 2012-05-10 11:22  aitilang  阅读(313)  评论(1编辑  收藏  举报

导航