孔雀开发小屋

专注并致力于手机客户端开发
<2010年2月>
31123456
78910111213
14151617181920
21222324252627
28123456
78910111213

统计

  • 随笔 - 103
  • 文章 - 0
  • 评论 - 251
  • 引用 - 0

常用链接

留言簿(38)

随笔分类

随笔档案

关注的博客

朋友的博客

搜索

  •  

最新评论

阅读排行榜

评论排行榜

Placement new的用法及用途
什么是placement new?

所谓placement new就是在用户指定的内存位置上构建新的对象,这个构建过程不需要额外分配内存,只需要调用对象的构造函数即可。
举例来说:
class foo{};
foo* pfoo = new foo;
pfoo指向的对象的地址你是不能决定的,因为new已经为你做了这些工作。第一步分配内存,第二步调用类的构造函数。
而placement new是怎么做的呢,说白了就是把原本new做的两步工作分开来。第一步你自己分配内存,第二步你调用类的构造函数在自己分配的内存上构建新的对象。


placement new的好处:
1)在已分配好的内存上进行对象的构建,构建速度快。
2)已分配好的内存可以反复利用,有效的避免内存碎片问题。

关于Placement new的标准用法,网上有一篇文章讲得很清楚,我这里再转述一下。

class Foo
{
    
char cc;
    
float f;

public:
    
void print() { std::cout << "ADDR: " << this << std::endl; }
    
void set_f( float _f ) { std::cout << "set f val : " << _f << std::endl; f = _f; }
    
void get_f() { std::cout << "get f val : " << f << std::endl; }
};

1)分配内存
char* buff = new charsizeof(Foo) * N ];
memset( buff, 
0sizeof(Foo)*N );

2)构建对象
Foo* pfoo = new (buff)Foo;

3)使用对象
pfoo->print();

pfoo
->set_f(1.0f);
pfoo
->get_f();

4)析构对象,显式的调用类的析构函数。
pfoo->~Foo();

5)销毁内存
delete [] buff;

上面5个步骤是标准的placement new的使用方法。

对于buff这块内存可以反复使用,只要重复2)、3)、4)步骤即可。

placement new还可以解决的一个问题是建立带参数的构造函数对象数组。
代码示例如下:
 1 class CPong
 2 {
 3 public:
 4     CPong( int m ) : v(m) { std::cout << "CPong ctor." << std::endl; }
 5 
 6 private:
 7     int v;
 8 };
 9 char* pong = new charsizeof(CPong) * 10 ];
10 CPong* pp = (CPong*)pong;
11 
12 for ( int i=0; i<10++i )
13 {
14     new (pp+i)CPong(i);
15 }
16 
17 for ( int j=0; j<10++j )
18 {
19     pp[j].~CPong();
20 }
21 
22 delete [] pong;


posted on 2010-02-20 14:20 孔雀 阅读(11439) 评论(4)  编辑 收藏 引用 所属分类: C/C++

评论

# re: Placement new的用法及用途 2010-02-20 16:15 OwnWaterloo

标准使用方法, 在第1步中应该只涉及内存分配行为, 比如使用operator new, operator new[], malloc。
memset也是不必要的。
在第5步中, 应该只涉及内存归还行为, 比如使用operator delete, operator delete[], free。
  回复  更多评论    

# re: Placement new的用法及用途 2010-02-20 17:06 孔雀

@OwnWaterloo
谢谢指教!
  回复  更多评论    

# re: Placement new的用法及用途 2010-02-24 09:55 飞鸽传书

写得挺好的。
  回复  更多评论    

# re: Placement new的用法及用途 2010-11-10 11:06 RingOfTheC

顶小琪琪
  回复  更多评论    

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理