C++ placement new 用法舉例zz
Posted on 2010-04-20 17:15 小強(qiáng)摩羯座 閱讀(3808) 評(píng)論(0) 編輯 收藏 所屬分類: C++ &VC
在處理內(nèi)存分配的時(shí)候,C++程序員會(huì)用new操作符(operator new)來分配內(nèi)存,并用delete操作符(operator delete)來釋放內(nèi)存。這是一個(gè)new操作符的例子。 class CTest 雖然這種寫法在大多數(shù)時(shí)候都工作得很好,但還是有些情況下使用new是很煩人的,比如當(dāng)你想重新分配一個(gè)數(shù)組或者當(dāng)你想在預(yù)分配的內(nèi)存上構(gòu)造一個(gè)對(duì)象的時(shí)候。 比如第一種情況,重新分配一個(gè)數(shù)組效率是很低的: // 分配一個(gè)有10個(gè)對(duì)象的數(shù)組 如果你想在預(yù)分配的內(nèi)存上創(chuàng)建對(duì)象,用缺省的new操作符是行不通的。要解決這個(gè)問題,你可以用placement new構(gòu)造。它允許你構(gòu)造一個(gè)新對(duì)象到預(yù)分配的內(nèi)存上: // buffer 是一個(gè)void指針 (void *) 下面是一些例子: #include <new> 當(dāng)你有自己的內(nèi)存緩沖區(qū)或者在你實(shí)現(xiàn)自己的內(nèi)存分配策略的時(shí)候,placement new會(huì)很有用。事實(shí)上在STL中廣泛使用了placement new來給容器分配內(nèi)存;每個(gè)容器類都有一個(gè)模版參數(shù)說明了構(gòu)造/析構(gòu)對(duì)象時(shí)所用的分配器(allocator)。 在使用placement new的時(shí)候,你要記住以下幾點(diǎn):
pFirst->~CTest(); ::棧上的對(duì)象(注意,是類對(duì)象,char類型就無需了,后面還會(huì)提到)保證放在對(duì)齊地址上. 但是,個(gè)人實(shí)驗(yàn)了一下,發(fā)現(xiàn)并不是這樣 例如: int main() { char c1 = 'A' ; char c2 = 'B' ; char c3 = 'C' ; char c4 = 'D' ; char c5 = 'E' ; //-------- 驗(yàn)證這四個(gè)地址是否是 4 的倍數(shù) --------------// if ( ((int)(&c1)) % 4 == 0 ) cout << "c1:Yes" << endl ; if ( ((int)(&c2)) % 4 == 0 ) cout << "c2:Yes" << endl ; if ( ((int)(&c3)) % 4 == 0 ) cout << "c3:Yes" << endl ; if ( ((int)(&c4)) % 4 == 0 ) cout << "c4:Yes" << endl ; if ( ((int)(&c5)) % 4 == 0 ) cout << "c5:Yes" << endl ; cout << (int)(&c1) << endl // 輸出四個(gè)字符所在的地址(輸出結(jié)果都是 4 的倍數(shù)) << (int)(&c2) << endl << (int)(&c3) << endl << (int)(&c4) << endl << (int)(&c5) << endl ; } ----------------------------- 上面的執(zhí)行結(jié)果在VC下運(yùn)行都是 4 的倍數(shù) -------------- --> 問題1:連棧上分配的空間地址都是 4 的倍數(shù),那就說明系統(tǒng)分配的空間都是 4 的倍數(shù)吧??? --> 問題2:如果萬一,如果放一個(gè)對(duì)象的地址不是4的倍數(shù),那么會(huì)出現(xiàn)什么情況??可以給簡單說一下嗎? --> 問題3:地址對(duì)齊的通用性??? ------------- 程序1: Class C1 { int i ; char c ; } ; cout << sizeof(C1) << endl ;// 輸出結(jié)果: 8 (是 4 的倍數(shù)) 程序2: class C2 { char c1 ; char c2 ; } ; cout << sizeof(C2) << endl ;// 輸出結(jié)果:2 ( 上一個(gè)中char類型也給了4個(gè)字節(jié),怎么這個(gè)地方都給了一個(gè)字節(jié)??) --> 問題4:由上面的程序2 引出下面的程序 class C2// sizeof(C2) =2 ,在VC實(shí)驗(yàn)下的結(jié)果,不是 4 { char c1 ; char c2 ; } ; //----------用placement new方法建立對(duì)象---------------- void *ptr = operator new(100) ;// 分配內(nèi)存 C2 *POINTER = (C2*)ptr ;// 類型轉(zhuǎn)換 String *str1 = new (POINTER) C2() ;// 建立一C2對(duì)象 String *str2 = new (POINTER+1) C2() ;// 再建立一個(gè)對(duì)象 String *str3 = new (POINTER+2) C2() ;// 再建立一個(gè)對(duì)象 cout << (int)(str1) << endl// 結(jié)果:3608720( 是4的倍數(shù)) << (int)(str2) << endl // 結(jié)果:3608722(不是4的倍數(shù))!! << (int)(str3) << endl ;// 結(jié)果:3608724(不是4的倍數(shù))!! |