中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁 > news >正文

做眾籌網(wǎng)站成都十大營銷策劃公司

做眾籌網(wǎng)站,成都十大營銷策劃公司,中國工信部備案查詢系統(tǒng),南寧手機(jī)平臺(tái)網(wǎng)網(wǎng)站建設(shè)有時(shí)候我們覺得,C的術(shù)語仿佛是要故意讓人難以理解似的。 這里就有一個(gè)例子:請(qǐng)說明new operator 和operator new 之間的差異(譯注:本書所說的new operator,即某些C教程如C Primer 所謂的new expression) 當(dāng)你寫出這樣…

有時(shí)候我們覺得,C++的術(shù)語仿佛是要故意讓人難以理解似的。

這里就有一個(gè)例子:請(qǐng)說明new operator 和operator new 之間的差異(譯注:本書所說的new operator,即某些C++教程如C++ Primer 所謂的new expression)

當(dāng)你寫出這樣的代碼:

string *ps= new string("Memory Management");

你所使用的 new 是所謂的new operator。

這個(gè)操作符是由語言內(nèi)建的,就像sizeof那樣,不能被改變意義,總是做相同的事情。

它的動(dòng)作分為兩方面。

  1. 第一,它分配足夠的內(nèi)存,用來放督某類型的對(duì)象。以上例而言,它分配足夠放置一個(gè)string 對(duì)象的內(nèi)存。
  2. 第二,它調(diào)用一個(gè)constructor,為剛才分配的內(nèi)存中的那個(gè)對(duì)象設(shè)定初值。

new operator總是做這兩件事,無論如何你不能夠改變其行為。

你能夠改變的是用來容納對(duì)象的那塊內(nèi)存的分配行為。也就是上面的第一步

new operator 調(diào)用某個(gè)函數(shù),執(zhí)行必要的內(nèi)存分配動(dòng)作你可以重寫或重載那個(gè)函數(shù),改變其行為。這個(gè)函數(shù)的名稱叫做operator new。頭昏了嗎?真的,我說的是真的。

函數(shù)operator new 通常聲明如下:

void * operator new(size_t size);

其返回值類型是void*。此函數(shù)返回一個(gè)指針,指向一塊原始的、未設(shè)初值的內(nèi)存(如果你喜歡,可以寫一個(gè)新版的operator new,在其返回內(nèi)存指針之前先將那塊內(nèi)存設(shè)定初值。只不過這種行為頗為罕見就是了)。

函數(shù)中的size_t 參數(shù)表示需要分配多少內(nèi)存。

你可以將operator new 重載,加上額外的參數(shù),但第一參數(shù)的類型必須總是 size_t(如何撰寫 operator new,相關(guān)信息請(qǐng)參考條款E8~E10)

吸中協(xié)從不想到要直接調(diào)用operator new,但如果你要,你可以像調(diào)用任何其他函數(shù)一樣地調(diào)用它:

void *rawMemory = operator new(sizeof(string));

這里的operator new將返回指針,指向一塊足夠容納一個(gè)string對(duì)象的內(nèi)存。

和malloc一樣,operator new的唯一任務(wù)就是分配內(nèi)存。它不知道什么是constructors, operator new只負(fù)責(zé)內(nèi)存分配。

取得 operator new 返回的內(nèi)存并將之轉(zhuǎn)換為一個(gè)對(duì)象,是new operator 的責(zé)任。

當(dāng)你的編譯器看到這樣一個(gè)句子:

string *ps= new string("Memory Management");

它必須產(chǎn)生一些代碼,或多或少會(huì)反映以下行為(見條款E8和條款E10,以及發(fā)表于C/C++ Users Journal, April1998 的文章《Counting Objects inC++》中的方塊內(nèi)容)

void *memory?=
operator new(sizeof(string));//取得原始內(nèi)存(raw memory)。用來放置一個(gè)string對(duì)象。call string::string("Memory Management")//將內(nèi)存中的對(duì)象初始化。
on *memorystring *ps=
static_cast<string*>(memory);//讓ps指向新完成的對(duì)象。

注意上述第二步驟涉及“調(diào)用一個(gè)constructor”,身為程序員的你沒有權(quán)力這么做。

然而你的編譯器百無禁忌,可以為所欲為。這就是為什么如果你想要做出一個(gè)heap-based object,一定得使用new operator 的原因:你無法直接調(diào)用“對(duì)象初始化所必需的constructor”
(尤其它可能得為重要成分vtbl設(shè)定初值,見條款24)。

Placement new

有時(shí)候你真的會(huì)想直接調(diào)用一個(gè)constructor。

針對(duì)一個(gè)已存在的對(duì)象調(diào)用其constructor 并無意義,因?yàn)?constructors 用來將對(duì)象初始化,而對(duì)象只能被初始化一次。

但是偶爾你會(huì)有一些分配好的原始內(nèi)存,你需要在上面構(gòu)建對(duì)象。有一個(gè)特殊版本的operator new,稱為placement new,允許你那么做。
下面示范如何使用 placement new:

class Widget {
public:
widget(int widgetsize);
//...
}widget * constructWidgetInBuffer (void *buffer, int widgetSize)
{
return new (buffer) Widget(widgetsize);
}

此函數(shù)返回指針,指向一個(gè)widget object,它被構(gòu)造于傳遞給此函數(shù)的一塊內(nèi)存緩沖區(qū)上。

當(dāng)程序運(yùn)行到shared memory 或memory-mapped I/O,這類函數(shù)可能是有用的,因?yàn)樵谀菢拥倪\(yùn)用中,對(duì)象必須置于特定地址,或是置于以特殊函數(shù)分配出來的內(nèi)存上(條款4列有placement new的另一個(gè)運(yùn)用實(shí)例)

在 constructWidgetInBuffer 函數(shù)內(nèi)部,唯一一個(gè)表達(dá)式是,

new (buffer) Widget(widgetSize)

乍見之下有點(diǎn)奇怪,其實(shí)不足為奇,這只是new operator 的用法之一,其中指定一個(gè)額外自變量(buffer)作為 new operator “隱式調(diào)用operator new”時(shí)所用。

于是,被調(diào)用的operator new除了接受“一定得有的size_t 自變量”之外,還接受了一個(gè)void*參數(shù),指向一塊內(nèi)存,準(zhǔn)備用來接受構(gòu)造好的對(duì)象。這樣的operator new 就是所謂的placement new,看起來像這樣:

void * operator new (size_t,void *location)//注意size_t后面沒名字
{
return location;
}

似乎比你預(yù)期得更簡單,但這便是placement new必須做的一切。

畢竟operator new的目的是要為對(duì)象找到一塊內(nèi)存,然后返回一個(gè)指針指向它。

在placement new的情況下,調(diào)用者已經(jīng)知道指向內(nèi)存的指針了,因?yàn)檎{(diào)用者知道對(duì)象應(yīng)該放在哪里。因此placement new 唯一需要做的就是將它獲得的指針再返回。

至于沒有用到(但一定得有)的size_t參數(shù),之所以不賦予名稱,為的是避免編譯器發(fā)出“某物未被使用”的警告(見條款6)Placement new 是C++標(biāo)準(zhǔn)程序庫(見條款E49)的一部分。

欲使用 placement new,你必須用#include <new>。如果你的編譯器尚未支持新式頭文件名稱的話(見條款E49),就用#include<new.h>。

花幾分鐘回頭想想 placement new,我們便能了解 new operator 和 operator new之間的關(guān)系,兩個(gè)術(shù)語雖然表面上令人迷惑,概念上卻十分直接易懂。

  1. 如果你希望將對(duì)象產(chǎn)生于heap,請(qǐng)使用 new operator。它不但分配內(nèi)存而且為該對(duì)象調(diào)用一個(gè)constructor。
  2. 如果你只是打算分配內(nèi)存,請(qǐng)調(diào)用 operator new,那就沒有任何constructor會(huì)被調(diào)用。
  3. 如果你打算在heap objects 產(chǎn)生時(shí)自己決定內(nèi)存分配方式,請(qǐng)寫一個(gè)自己的 operator new,并使用 new operator,它將會(huì)自動(dòng)調(diào)用你所寫的operator new。
  4. 如果你打算在已分配(并擁有指針)的內(nèi)存中構(gòu)造對(duì)象,請(qǐng)使用placement new(若想更深入地了解new和delete,請(qǐng)見條款E7及發(fā)表于C/C++Users Journal, April1998的文章《Counting Objects in C++》)

刪除(Deletion)與內(nèi)存釋放(Deallocation)

為了避免resource leaks(資源泄漏),每一個(gè)動(dòng)態(tài)分配行為都必須匹配一個(gè)相應(yīng)但相反的釋放動(dòng)作。函數(shù)operator delete 對(duì)于內(nèi)建的delete operator,就好像operator new對(duì)于new operator 一樣。當(dāng)你寫出這樣的代碼:

string *ps;
//。。。
delete ps;// 使用 delete operator。


你的編譯器必須產(chǎn)生怎樣的代碼?

它必須既能夠析構(gòu) ps所指對(duì)象,又能夠釋放被該對(duì)象占用的內(nèi)存。

內(nèi)存釋放動(dòng)作是由函數(shù)operator delete 執(zhí)行,通常聲明如下:

void operator delete(void *memoryToBeDeallocated);

因此,下面這個(gè)動(dòng)作:

delete ps;


會(huì)造成編譯器產(chǎn)生近似這樣的代碼:

ps->~string();// 調(diào)用對(duì)象的dtoroperator。operator delete (ps);//釋放對(duì)象所占用的內(nèi)存。

這里呈現(xiàn)的一個(gè)暗示就是,如果你只打算處理原始的、未設(shè)初值的內(nèi)存,應(yīng)該完全回避new operator 和 delete operators,改調(diào)用operator new取得內(nèi)存并以operator delete 歸還給系統(tǒng):

void *buffer=operator new(50*sizeof(char));//分配足夠的內(nèi)存,放置50個(gè) chars;沒有調(diào)用任何ctorsoperator delete(buffer);//釋放內(nèi)存,沒有調(diào)用任何dtors。

這組行為在C++中相當(dāng)于調(diào)用malloc和free。

如果你使用placement new,在某內(nèi)存塊中產(chǎn)生對(duì)象,你應(yīng)該避免對(duì)那塊內(nèi)存使用delete opcrator.因?yàn)?delete operator會(huì)調(diào)用 operator delete來釋放內(nèi)存,但是該內(nèi)存內(nèi)含的對(duì)象最初并非是由 operator new分配得來的。

畢竟placemen new只是返回它所接收的指針而已,誰知道那個(gè)指針從哪里來呢?所以為了抵消該對(duì)象的constructor的影響,你應(yīng)該直接調(diào)用該對(duì)象的destructor:

//以下函數(shù)用來分配及釋放 shared memory 中的內(nèi)存。
void* mallocshared(size_t size);
void freeShared(void *memory);void*sharedMemory=mallocShared(sizeof(Widget));//和先前相同,運(yùn)用Widget*pw=constructWidgetInBuffer(sharedMemory, 10); // placement new。
//..
delete pw;//無定義!因?yàn)閟haredMemory 來自mallocshared,不是來自 operator new。pw->~Widget();
//可!析構(gòu) pw 所指的widget 對(duì)象,
//但并未釋放widget占用的內(nèi)存。freeShared(pw);
//可!釋放 pw所指的內(nèi)存,
//不調(diào)用任何 destructor。

如此例所示,如果交給placement new 的原始內(nèi)存(raw memory)本身是動(dòng)態(tài)分配而得(通過某種非傳統(tǒng)做法),那么你最終還是得釋放那塊內(nèi)存,以免遭受內(nèi)存泄漏(memory leak)之苦(請(qǐng)參考文章《Counting Objects inC++》之中的方塊內(nèi)容,其中對(duì)所謂的“placement delete”有些介紹)。

數(shù)組(Arrays)

目前為止一切都好,但我們還有更遠(yuǎn)的路要走。截至目前我們考慮的每件事情都只在單一對(duì)象身上打轉(zhuǎn)。面對(duì)數(shù)組怎么辦?下面會(huì)發(fā)生什么事情;

string *ps= new string[10);//分配一個(gè)對(duì)象數(shù)組

上述使用的new 仍然是那個(gè)new operator,但由于誕生的是數(shù)組,所以new operator的行為與先前產(chǎn)生單一對(duì)象的情況略有不同。

是的,內(nèi)存不再以operator new分配,而是由其“數(shù)組版”兄弟,一個(gè)名為operator new[]的函數(shù)負(fù)責(zé)分配(通常被稱為“aray new”)。

和operator new一樣,operator new[]也可以被重載。這使你得奪取數(shù)組的內(nèi)存分配權(quán),就像你可以控制單一對(duì)象的內(nèi)存分配一樣(不過條款E8對(duì)此有些警告)。

operatornew[]是相當(dāng)晚的時(shí)候才加入C++的一個(gè)特性,所以你的編譯器或許尚未支持它。

如果是這樣,全局operator new會(huì)被用來為每個(gè)數(shù)組分配內(nèi)存一不論數(shù)組中的對(duì)象類型是什么。

在這樣的編譯器下定制“數(shù)組內(nèi)存分配行為”很困難,因?yàn)槟愕酶膶懭职娴?operator new才行。這可不是件容易的工作。

默認(rèn)情況下全局版的operator new負(fù)責(zé)程序中所有的動(dòng)態(tài)內(nèi)存分配,所以其行為的任何改變都可能帶來劇烈而普遍的影響。此外,全局版本的operator new,其正規(guī)形式的型構(gòu)(eignature)(我的意思是,只有唯一size_t參數(shù)的那個(gè),見條款E9)只有一個(gè),所以如果你決定聲稱它為你所擁有,你的軟件便立刻不容于任何做了相同決定的程序庫(見條款 27)。

多方考慮之下,如果你面對(duì)的是尚未支持 。perator new[]的編譯器,定制“數(shù)組內(nèi)存管理行為”往往不是個(gè)理想的決定。

“數(shù)組版”與“單一對(duì)象版”的newoperator的第二個(gè)不同是,它所調(diào)用的constructor數(shù)量。數(shù)組版new operator 必須針對(duì)數(shù)組中的每個(gè)對(duì)象調(diào)用一個(gè)constructor:

string *ps =//調(diào)用operator new[]以分配足夠容納new string[10];//10個(gè) string 對(duì)象的內(nèi)存,然后
//針對(duì)每個(gè)元素調(diào)用 string default ctor。

同樣道理,當(dāng)delete operator 被用于數(shù)組,它會(huì)針對(duì)數(shù)組中的每個(gè)元素調(diào)用其 destructor,然后再調(diào)用 operator delete[]釋放內(nèi)存:

delete []?ps;
//為數(shù)組中的每個(gè)元素調(diào)用 string dtor.

然后調(diào)用 operator delete[]以釋放內(nèi)存。

就好像你可以取代或重載 operator delete一樣,你也可以取代或重載operator delete[]。不過兩者的重載有著相同的限制。請(qǐng)你找一本好的C++教程,查閱其細(xì)節(jié)。說到好的C++教程,本書p285列有我的一份推薦名單。

現(xiàn)在,你有了完整的知識(shí)。

new operator 和delete operator 都是內(nèi)建操作符,無法為你所控制,但是它們所調(diào)用的內(nèi)存分配/釋放函數(shù)則不然。

當(dāng)你想要定制new operator 和 delete operator的行為,記住,你其實(shí)無法真正辦到。你可以修改它們完成任務(wù)的方式,至于它們的任務(wù),已經(jīng)被語言規(guī)范固定死了。

http://www.risenshineclean.com/news/44706.html

相關(guān)文章:

  • 杭州做網(wǎng)站的公司排行全國疫情高峰感染高峰
  • 深圳沙井做公司網(wǎng)站最近最新的新聞
  • woocommerce做零售網(wǎng)站網(wǎng)站排名推廣工具
  • 網(wǎng)站開發(fā)需要有什么證書搜索引擎排名查詢工具
  • 大連自己的網(wǎng)站大數(shù)據(jù)營銷專業(yè)
  • 做網(wǎng)站 怎么選擇公司今日新聞聯(lián)播主要內(nèi)容摘抄
  • 找別人做網(wǎng)站交貨時(shí)應(yīng)該注意什么禁止搜索引擎收錄的方法
  • 網(wǎng)站建設(shè)貳金手指科杰2如何做電商賺錢
  • 電子商務(wù)網(wǎng)站建設(shè)可用性深圳市seo網(wǎng)絡(luò)推廣哪家好
  • 建設(shè)政府網(wǎng)站多少錢青島seo關(guān)鍵詞排名
  • 建設(shè)部規(guī)范網(wǎng)站關(guān)鍵詞優(yōu)化的策略有哪些
  • 黃驊市第五中學(xué)北京seo推廣外包
  • 想在百度做網(wǎng)站自動(dòng)推廣工具
  • 開發(fā)大型網(wǎng)站的流程推廣方案經(jīng)典范文
  • 中國航發(fā)網(wǎng)上商城首頁優(yōu)化課程設(shè)置
  • 黑色網(wǎng)站后臺(tái)公司網(wǎng)站推廣
  • 網(wǎng)站flash制作教程友鏈目錄網(wǎng)
  • 做網(wǎng)站 做應(yīng)用網(wǎng)絡(luò)推廣引流是做什么的
  • 網(wǎng)站建設(shè)目標(biāo)及需求百度搜索排名怎么收費(fèi)
  • 一個(gè)好的網(wǎng)站建設(shè)優(yōu)化大師官網(wǎng)登錄入口
  • 淘寶客的網(wǎng)站是自己做的嗎深圳專業(yè)seo外包
  • 做網(wǎng)站開發(fā)需要學(xué)那些東西安裝百度到手機(jī)桌面
  • 網(wǎng)頁設(shè)計(jì)素材網(wǎng)站有哪些怎么自己弄一個(gè)網(wǎng)站
  • 學(xué)室內(nèi)設(shè)計(jì)真的那么慘嗎北京seo專員
  • 自己做的小網(wǎng)站如何發(fā)布軟文范例
  • 重慶模板網(wǎng)站多少錢烘焙甜點(diǎn)培訓(xùn)學(xué)校
  • 制作網(wǎng)站程序黑帽seo培訓(xùn)大神
  • 手機(jī)在線銷售網(wǎng)站 - 百度百度人工客服電話怎么轉(zhuǎn)人工
  • 學(xué)習(xí)做網(wǎng)站的網(wǎng)站愛站關(guān)鍵詞挖掘工具
  • 網(wǎng)游網(wǎng)站開發(fā)如何做好搜索引擎優(yōu)化工作