什麼是placement new?
所謂placement new就是在使用者指定的記憶體位置上構建新的物件,這個構建過程不需要額外分配記憶體,只需要呼叫物件的建構函式即可。
舉例來說:
class foo{};
foo* pfoo = new foo;
pfoo指向的物件的位址你是不能決定的,因為new已經為你做了這些工作。第一步分配記憶體,第二步呼叫類的建構函式。
而placement new是怎麼做的呢,說白了就是把原本new做的兩步工作分開來。第一步你自己分配記憶體,第二步你呼叫類的建構函式在自己分配的記憶體上構建新的物件。
placement new的好處:
1)在已分配好的記憶體上進行物件的構建,構建速度快。
2)已分配好的記憶體可以反覆利用,有效的避免記憶體碎片問題。
關於placement new的標準用法,網上有一篇文章 講得很清楚,我這裡再轉述一下。
class
foovoid
set_f(
float
_f )
void
get_f() };
1)分配記憶體
char
*buff
=new
char
[ sizeof
(foo)
*n ];
memset( buff, 0,
sizeof
(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還可以解決的乙個問題是建立帶引數的建構函式物件陣列。
**示例如下:
1class
cpong25
6private:7
intv;8};
9char
*pong
=new
char
[ sizeof
(cpong) *10
];10
cpong
*pp
=(cpong
*)pong;
1112
for(
inti=0
; i<
10;
++i )
1316
17for
( intj=
0; j
<
10;
++j )
1821
22delete pong;
Placement new的用法及用途
什麼是placement new?所謂placement new就是在使用者指定的記憶體位置上構建新的物件,這個構建過程不需要額外分配記憶體,只需要呼叫物件的建構函式即可。舉例來說 class foo foo pfoo new foo pfoo指向的物件的位址你是不能決定的,因為new已經為你做了這...
placement new的用法及用途
本文 所謂placement new就是在使用者指定的記憶體位置上構建新的物件,這個構建過程不需要額外分配記憶體,只需要呼叫物件的建構函式即可。舉例來說 class foo foo pfoo new foo pfoo指向的物件的位址你是不能決定的,因為new已經為你做了這些工作。第一步分配記憶體,第...
遵循placement new的用法規範
widget p new widget ordinary new 普通的new pi new ptr int pi new ptr int placement new 括號裡的引數是乙個指標,它指向乙個記憶體緩衝器,placement new將在這個緩衝器上分配乙個物件。placement new的...