在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀(guān)看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何讓new操作符不分配內(nèi)存,只構(gòu)造

Linux愛(ài)好者 ? 來(lái)源:Linux愛(ài)好者 ? 作者:Linux愛(ài)好者 ? 2021-01-19 17:01 ? 次閱讀

【導(dǎo)讀】:本文主要介紹如何讓new操作符不分配內(nèi)存,只構(gòu)造。

問(wèn)題

c++中的new操作符通常完成兩個(gè)工作分配內(nèi)存及調(diào)用相應(yīng)的構(gòu)造函數(shù)。

請(qǐng)問(wèn):

如何讓new操作符不分配內(nèi)存,只調(diào)用構(gòu)造函數(shù)?

這樣的用法有什么用?

placement new的含義

placement new可以實(shí)現(xiàn)不分配內(nèi)存,只調(diào)用構(gòu)造函數(shù)。

void*operatornew(size_t,void*p)throw(){returnp;}

placement new的執(zhí)行忽略了size_t參數(shù),只返還第二個(gè)參數(shù)。

其結(jié)果是允許用戶(hù)把一個(gè)對(duì)象放到一個(gè)特定的地方,達(dá)到調(diào)用構(gòu)造函數(shù)的效果。

用法如下:

#include #include classTest { public: Test() { std::cout<~Test(); } }

輸出:

Constructor Constructor Destructor

和其他普通的new不同的是,它在括號(hào)里多了另外一個(gè)參數(shù)。比如:

Widget*p=newWidget;---------//ordinarynew pi=new(ptr)int;pi=new(ptr)int;//placementnew

括號(hào)里的參數(shù)ptr是一個(gè)指針,它指向一個(gè)內(nèi)存緩沖器,placement new將在這個(gè)緩沖器上分配一個(gè)對(duì)象。

Placement new的返回值是這 個(gè)被構(gòu)造對(duì)象的地址(比如括號(hào)中的傳遞參數(shù))。

placement new主要適用于:在對(duì)時(shí)間要求非常高的應(yīng)用程序中,因?yàn)檫@些程序分配的時(shí)間是確定 的;長(zhǎng)時(shí)間運(yùn)行而不被打斷的程序;以及執(zhí)行一個(gè)垃圾收集器 (garbage collector)。

new 、operator new 和 placement new 區(qū)別

new :不能被重載,其行為總是一致的。它先調(diào)用operator new分配內(nèi)存,然后調(diào)用構(gòu)造函數(shù)初始化那段內(nèi)存。

operator new:要實(shí)現(xiàn)不同的內(nèi)存分配行為,應(yīng)該重載operator new,而不是new。

delete和operator delete類(lèi)似。delete首先調(diào)用對(duì)象的析構(gòu)函數(shù),然后調(diào)用operator delete釋放掉所使用的內(nèi)存。

placement new:只是operator new重載的一個(gè)版本。它并不分配內(nèi)存,只是返回指向已經(jīng)分配好的某段內(nèi)存的一個(gè)指針。因此不能刪除它,但需要調(diào)用對(duì)象的析構(gòu)函數(shù)。

new 操作符的執(zhí)行過(guò)程

調(diào)用operator new分配內(nèi)存 ;

調(diào)用構(gòu)造函數(shù)生成類(lèi)對(duì)象;

返回相應(yīng)指針。

placement new允許你在一個(gè)已經(jīng)分配好的內(nèi)存中(棧或者堆中)構(gòu)造一個(gè)新的對(duì)象。原型中void*p實(shí)際上就是指向一個(gè)已經(jīng)分配 好的內(nèi)存緩沖區(qū)的的首地址。

Placement new 存在的理由

用Placement new 解決buffer的問(wèn)題

問(wèn)題描述:

用new分配的數(shù)組緩沖時(shí),由于調(diào)用了默認(rèn)構(gòu)造函數(shù),因此執(zhí)行效率上不佳。若沒(méi)有默認(rèn)構(gòu)造函數(shù)則會(huì)發(fā)生編譯時(shí)錯(cuò)誤。如果你想在預(yù)分配的內(nèi)存上創(chuàng)建對(duì)象,用缺省的new操作符是行不通的。要解決這個(gè)問(wèn)題,你可以用placement new構(gòu)造。它允許你構(gòu)造一個(gè)新對(duì)象到預(yù)分配的內(nèi)存上。

增大時(shí)空效率的問(wèn)題

使用new操作符分配內(nèi)存需要在堆中查找足夠大的剩余空間,顯然這個(gè)操作速度是很慢的,而且有可能出現(xiàn)無(wú)法分配內(nèi)存的異常(空間不夠)。

placement new 就可以解決這個(gè)問(wèn)題。我們構(gòu)造對(duì)象都是在一個(gè)預(yù)先準(zhǔn)備好了的內(nèi)存緩沖區(qū)中進(jìn)行,不需要查找內(nèi)存,內(nèi)存分配的時(shí)間是常數(shù);而且不會(huì)出現(xiàn)在程序運(yùn)行中途出現(xiàn)內(nèi) 存不足的異常。所以,placement new非常適合那些對(duì)時(shí)間要求比較高,長(zhǎng)時(shí)間運(yùn)行不希望被打斷的應(yīng)用程序。

使用步驟

在很多情況下,placement new的使用方法和其他普通的new有所不同。這里提供了它的使用步驟。

第一步 緩存提前分配

有三種方式:

為了保證通過(guò)placement new使用的緩存區(qū)的memory alignmen(內(nèi)存隊(duì)列)正確準(zhǔn)備,使用普通的new來(lái)分配它:在堆上進(jìn)行分配

classTask; char*buff=new[sizeof(Task)];//分配內(nèi)存

(請(qǐng)注意auto或者static內(nèi)存并非都正確地為每一個(gè)對(duì)象類(lèi)型排列,所以,你將不能以placement new使用它們。)

在棧上進(jìn)行分配

classTask; charbuf[N*sizeof(Task)];//分配內(nèi)存

還有一種方式,就是直接通過(guò)地址來(lái)使用。(必須是有意義的地址)

void*buf=reinterpret_cast(0xF00F);

第二步:對(duì)象的分配

在剛才已分配的緩存區(qū)調(diào)用placement new來(lái)構(gòu)造一個(gè)對(duì)象。

Task*ptask=new(buf)Task

第三步:使用

按照普通方式使用分配的對(duì)象:

ptask->memberfunction(); ptask->member; //...

第四步:對(duì)象的析構(gòu)

一旦你使用完這個(gè)對(duì)象,你必須調(diào)用它的析構(gòu)函數(shù)來(lái)毀滅它。按照下面的方式調(diào)用析構(gòu)函數(shù):

ptask->~Task();//調(diào)用外在的析構(gòu)函數(shù)

第五步:釋放

你可以反復(fù)利用緩存并給它分配一個(gè)新的對(duì)象(重復(fù)步驟2,3,4)如果你不打算再次使用這個(gè)緩存,你可以象這樣釋放它:

delete[]buf;

跳過(guò)任何步驟就可能導(dǎo)致運(yùn)行時(shí)間的崩潰,內(nèi)存泄露,以及其它的意想不到的情況。如果你確實(shí)需要使用placement new,請(qǐng)認(rèn)真遵循以上的步驟。

性能對(duì)比

采用placement new和new的方式創(chuàng)建和刪除對(duì)象一萬(wàn)次,統(tǒng)計(jì)時(shí)間,單位是us。

intmain() { { uint64_tstart=GetCurrentTimeInMicroSeconds(); for(uint32_ti=0;i~Test(); } std::cout<

結(jié)果:

placementnew:186 new:1448

結(jié)論:在頻繁構(gòu)造和析構(gòu)對(duì)象的場(chǎng)景中,placement new對(duì)性能有7倍的提升。

責(zé)任編輯:lq

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀(guān)點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 緩沖器
    +關(guān)注

    關(guān)注

    6

    文章

    2039

    瀏覽量

    46781
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4374

    瀏覽量

    64422
  • 應(yīng)用程序
    +關(guān)注

    關(guān)注

    38

    文章

    3324

    瀏覽量

    58830

原文標(biāo)題:如何讓 new 操作符只構(gòu)造,不申請(qǐng)內(nèi)存

文章出處:【微信號(hào):LinuxHub,微信公眾號(hào):Linux愛(ài)好者】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    如何使用LAX_CODEGEN啟用動(dòng)態(tài)內(nèi)存分配

    我目前正在探索NXP_MBDToolbox_LAX。lax_codegen 生成的代碼基于靜態(tài)分配。我想管理大型向量,如何使用 LAX_CODEGEN 啟用動(dòng)態(tài)內(nèi)存分配
    發(fā)表于 04-10 08:09

    如何查看S32DS中S32平臺(tái)的內(nèi)存分配

    大家好,我正在使用 s32DS for s32 平臺(tái),我想查看我的項(xiàng)目的內(nèi)存分配。我想知道分配給對(duì)象的內(nèi)存以及它們被分配到哪里,例如 SRA
    發(fā)表于 04-09 07:30

    golang內(nèi)存分配

    內(nèi)存碎片. 線(xiàn)程擁有一定的 cache, 可用于無(wú)鎖分配. 同時(shí) Go 對(duì)于 GC 后回收的內(nèi)存頁(yè), 并不是馬上歸還給操作系統(tǒng), 而是會(huì)延遲歸還, 用于滿(mǎn)足未來(lái)的
    的頭像 發(fā)表于 03-31 15:00 ?157次閱讀
    golang<b class='flag-5'>內(nèi)存</b><b class='flag-5'>分配</b>

    hyper v 內(nèi)存,hyper v 內(nèi)存設(shè)置的操作步驟和方法是什么?

    在利用Hyper-V搭建和管理虛擬機(jī)的過(guò)程中,合理設(shè)置虛擬機(jī)的內(nèi)存至關(guān)重要。內(nèi)存分配是否恰當(dāng),會(huì)直接影響到虛擬機(jī)的運(yùn)行性能和穩(wěn)定性。若內(nèi)存分配
    的頭像 發(fā)表于 01-24 15:22 ?596次閱讀
    hyper v <b class='flag-5'>內(nèi)存</b>,hyper v <b class='flag-5'>內(nèi)存</b>設(shè)置的<b class='flag-5'>操作</b>步驟和方法是什么?

    EE-32:語(yǔ)言擴(kuò)展:內(nèi)存存儲(chǔ)類(lèi)型、ASM和內(nèi)聯(lián)構(gòu)造

    電子發(fā)燒友網(wǎng)站提供《EE-32:語(yǔ)言擴(kuò)展:內(nèi)存存儲(chǔ)類(lèi)型、ASM和內(nèi)聯(lián)構(gòu)造.pdf》資料免費(fèi)下載
    發(fā)表于 01-14 15:03 ?0次下載
    EE-32:語(yǔ)言擴(kuò)展:<b class='flag-5'>內(nèi)存</b>存儲(chǔ)類(lèi)型、ASM和內(nèi)聯(lián)<b class='flag-5'>構(gòu)造</b>

    邏輯異或運(yùn)算在Python中的用法

    在Python編程語(yǔ)言中,邏輯異或運(yùn)算并不直接作為一個(gè)內(nèi)置的操作符存在,因?yàn)镻ython更側(cè)重于高級(jí)編程和可讀性,并沒(méi)有直接提供異或運(yùn)算的簡(jiǎn)寫(xiě)形式用于邏輯運(yùn)算(真/假值的異或)。然而
    的頭像 發(fā)表于 11-19 09:46 ?784次閱讀

    技術(shù)干貨驛站 ▏解鎖C語(yǔ)言高效編程秘訣:深入解析運(yùn)算與優(yōu)先級(jí)

    和邏輯表達(dá)。1位運(yùn)算“程序中的所有數(shù)在計(jì)算機(jī)內(nèi)存中都是以二進(jìn)制的形式儲(chǔ)存的,位運(yùn)算可以直接對(duì)整數(shù)在內(nèi)存中的二進(jìn)制位進(jìn)行操作,運(yùn)位算包括位邏輯運(yùn)算和移位運(yùn)算。變量A
    的頭像 發(fā)表于 10-13 08:09 ?585次閱讀
    技術(shù)干貨驛站 ▏解鎖C語(yǔ)言高效編程秘訣:深入解析運(yùn)算<b class='flag-5'>符</b>與優(yōu)先級(jí)

    鴻蒙原生應(yīng)用元服務(wù)開(kāi)發(fā)-倉(cāng)頡基礎(chǔ)數(shù)據(jù)類(lèi)型整數(shù)類(lèi)型

    (十進(jìn)制)。 整數(shù)類(lèi)型支持的操作 整數(shù)類(lèi)型默認(rèn)支持的操作符包括:算術(shù)操作符、位操作符、關(guān)系操作符、自增和自減
    發(fā)表于 09-13 14:55

    鴻蒙原生應(yīng)用元服務(wù)開(kāi)發(fā)-倉(cāng)頡基礎(chǔ)數(shù)據(jù)類(lèi)型布爾類(lèi)型

    let b: Bool = false 布爾類(lèi)型支持的操作 布爾類(lèi)型支持的操作符包括:邏輯操作符(邏輯非!,邏輯與 &&,邏輯或 ||)、部分關(guān)系操作符
    發(fā)表于 09-09 09:57

    轉(zhuǎn)載 golang內(nèi)存分配

    . 線(xiàn)程擁有一定的 cache, 可用于無(wú)鎖分配. 同時(shí) Go 對(duì)于 GC 后回收的內(nèi)存頁(yè), 并不是馬上歸還給操作系統(tǒng), 而是會(huì)延遲歸還, 用于滿(mǎn)足未來(lái)的內(nèi)存需求. ?? ? 在 1.
    的頭像 發(fā)表于 09-05 14:12 ?461次閱讀
    轉(zhuǎn)載 golang<b class='flag-5'>內(nèi)存</b><b class='flag-5'>分配</b>

    c語(yǔ)言中從左到右結(jié)合怎么看

    在C語(yǔ)言中,操作符的結(jié)合性(Associativity)是指當(dāng)操作符在表達(dá)式中連續(xù)出現(xiàn)時(shí),它們?nèi)绾闻c操作數(shù)結(jié)合的順序。對(duì)于大多數(shù)二元操作符(即需要兩個(gè)
    的頭像 發(fā)表于 08-20 11:42 ?1551次閱讀

    c語(yǔ)言從右到左的運(yùn)算有哪些

    用在變量之后時(shí),它們會(huì)先返回變量的原始值,然后再進(jìn)行遞增或遞減。 三元條件運(yùn)算 ( ?: ):這個(gè)運(yùn)算的求值順序是從右到左。首先計(jì)算第三個(gè)表達(dá)式,然后根據(jù)第一個(gè)表達(dá)式的結(jié)果選擇第二個(gè)或第三個(gè)表達(dá)式。 賦值運(yùn)算 ( = ):
    的頭像 發(fā)表于 08-20 11:39 ?1760次閱讀

    HarmonyOS Next原生應(yīng)用開(kāi)發(fā)-從TS到ArkTS的適配規(guī)則(八)

    :arkts-no-props-by-index 級(jí)別:錯(cuò)誤 ArkTS不支持動(dòng)態(tài)聲明字段,不支持動(dòng)態(tài)訪(fǎng)問(wèn)字段。只能訪(fǎng)問(wèn)已在類(lèi)中聲明或者繼承可見(jiàn)的字段,訪(fǎng)問(wèn)其他字段將會(huì)造成編譯時(shí)錯(cuò)誤。 使用點(diǎn)操作符訪(fǎng)問(wèn)字段,例如
    發(fā)表于 07-23 16:54

    可以用os_malloc() 分配多少內(nèi)存?有哪些限制?

    我可以用 os_malloc() 分配多少內(nèi)存?有哪些限制?
    發(fā)表于 07-15 06:32

    FPGA學(xué)習(xí)筆記---基本語(yǔ)法

    3、信號(hào)類(lèi)型:wire, reg, tri等 4、參數(shù)定義:parameter 5、運(yùn)算操作符:各種邏輯操作符、移位操作符、算數(shù)操作符等 6、比較判斷:if ... else, ca
    發(fā)表于 06-23 14:58
    主站蜘蛛池模板: 色色色色色网 | 天堂资源地址在线 | a级网| 亚洲成在人天堂一区二区 | 99精品国产在热久久 | 岛国大片在线播放 | 男人在线网站 | 美女黄色毛片 | 一级毛片美国一级j毛片不卡 | 高清视频免费 | 国产色婷婷精品综合在线 | 最近国语剧情视频在线观看 | аⅴ天堂 在线 | 天天狠天天天天透在线 | 久久免费福利视频 | 日本www在线观看 | 亚洲一区在线视频 | 天堂资源在线www中文 | 欧美一级二级三级视频 | 一二三区视频 | 亚洲欧美日韩另类精品一区二区三区 | 天堂资源在线播放 | 啪啪免费视频网站 | 狠狠色婷婷丁香六月 | 天天看片天天爽 | 色拍拍综合网 | 夜夜爽夜夜爽 | 国产一区二区三区夜色 | 国产毛片农村妇女aa板 | a理论片 | 深夜网站免费 | 99pao在线视频精品免费 | 色碰人色碰人视频 | 日韩天堂在线观看 | 男人午夜禁片在线观看 | 欧美影院在线 | 特级片在线观看 | 欧美极品第1页专区 | 日韩亚洲欧洲在线rrrr片 | 天天天操 | 精品伊人久久大线蕉色首页 |