chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

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

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

Linux愛好者 ? 來源:Linux愛好者 ? 作者:Linux愛好者 ? 2021-01-19 17:01 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

問題

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

請問:

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

這樣的用法有什么用?

placement new的含義

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

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

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

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

用法如下:

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

輸出:

Constructor Constructor Destructor

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

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

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

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

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

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

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

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

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

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

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

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

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

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

placement new允許你在一個已經(jīng)分配好的內(nèi)存中(?;蛘叨阎校?gòu)造一個新的對象。原型中void*p實際上就是指向一個已經(jīng)分配 好的內(nèi)存緩沖區(qū)的的首地址。

Placement new 存在的理由

用Placement new 解決buffer的問題

問題描述:

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

增大時空效率的問題

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

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

使用步驟

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

第一步 緩存提前分配

有三種方式:

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

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

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

在棧上進行分配

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

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

void*buf=reinterpret_cast(0xF00F);

第二步:對象的分配

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

Task*ptask=new(buf)Task

第三步:使用

按照普通方式使用分配的對象:

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

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

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

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

第五步:釋放

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

delete[]buf;

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

性能對比

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

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

結(jié)果:

placementnew:186 new:1448

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

責任編輯:lq

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

    關(guān)注

    6

    文章

    2168

    瀏覽量

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

    關(guān)注

    3

    文章

    4400

    瀏覽量

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

    關(guān)注

    38

    文章

    3339

    瀏覽量

    59706

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

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

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

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

    FAQ_MA35_Family M4 RAM如何調(diào)整M4的內(nèi)存分配

    FAQ_MA35_Family M4 RAM如何調(diào)整M4的內(nèi)存分配?
    發(fā)表于 09-02 06:07

    靈活高效ZBUFF — C內(nèi)存數(shù)據(jù)操作庫:優(yōu)化內(nèi)存管理的利器

    在C語言開發(fā)中,高效的內(nèi)存管理是提升程序性能的關(guān)鍵。ZBUFF作為一款靈活高效的內(nèi)存數(shù)據(jù)操作庫,通過優(yōu)化內(nèi)存分配與釋放機制,為開發(fā)者提供了更
    的頭像 發(fā)表于 08-14 18:01 ?436次閱讀
    靈活高效ZBUFF — C<b class='flag-5'>內(nèi)存</b>數(shù)據(jù)<b class='flag-5'>操作</b>庫:優(yōu)化<b class='flag-5'>內(nèi)存</b>管理的利器

    靈活高效雙引擎驅(qū)動:ZBUFFC語言內(nèi)存操作更智能!

    ZBUFF庫深度融合了智能內(nèi)存分配算法與實時監(jiān)測機制,能夠自動適應(yīng)不同場景下的內(nèi)存需求。其自適應(yīng)碎片整理功能和錯誤檢測模塊,不僅保障了內(nèi)存使用的高效性,更大幅降低了調(diào)試難度,助力開發(fā)者
    的頭像 發(fā)表于 08-11 13:27 ?332次閱讀
    靈活高效雙引擎驅(qū)動:ZBUFF<b class='flag-5'>讓</b>C語言<b class='flag-5'>內(nèi)存</b><b class='flag-5'>操作</b>更智能!

    linux系統(tǒng)awk特殊字符命令詳解

    在Linux系統(tǒng)中,awk?是一種非常強大的文本處理工具,能夠?qū)ξ谋緮?shù)據(jù)進行分析、格式化和篩選。利用其內(nèi)置的特殊字符和操作符,用戶可以實現(xiàn)復(fù)雜的數(shù)據(jù)處理任務(wù)。以下對一些常見的awk特殊字符和操作符
    的頭像 發(fā)表于 07-28 16:38 ?299次閱讀

    千方科技推出AI大模型公路構(gòu)造物評定系統(tǒng)

    公路構(gòu)造物(橋梁、隧道、涵洞等)檢測評定是養(yǎng)護管理的核心環(huán)節(jié),通過量化構(gòu)造物的技術(shù)狀況評定等級,可為養(yǎng)護資源分配決策提供技術(shù)支持。傳統(tǒng)公路構(gòu)造物技術(shù)狀況評定面臨“三座大山”:一是評定結(jié)
    的頭像 發(fā)表于 07-09 15:54 ?549次閱讀

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

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

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

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

    golang內(nèi)存分配

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

    快速搞懂C語言程序內(nèi)存分區(qū)!

    在程序運行過程中,操作系統(tǒng)會根據(jù)程序的需要,將內(nèi)存劃分為多個功能不同的區(qū)段,以便更高效地管理內(nèi)存資源和確保程序的穩(wěn)定運行。不同的內(nèi)存區(qū)段負責存儲不同類型的數(shù)據(jù)和代碼,涵蓋了從程序指令、
    的頭像 發(fā)表于 03-14 17:37 ?1095次閱讀
    快速搞懂C語言程序<b class='flag-5'>內(nèi)存</b>分區(qū)!

    Nand flash 和SD卡(SD NAND)存儲扇區(qū)分配表異同

    : 存儲結(jié)構(gòu)與層次:NAND Flash 通常作為底層存儲介質(zhì),其存儲扇區(qū)分配表相對較為底層和直接,與閃存芯片的物理結(jié)構(gòu)緊密相關(guān)。它需要考慮閃存的擦除、寫入特性,以及壞塊管理等底層操作。而SD卡(米客方
    發(fā)表于 03-13 10:45

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

    在利用Hyper-V搭建和管理虛擬機的過程中,合理設(shè)置虛擬機的內(nèi)存至關(guān)重要。內(nèi)存分配是否恰當,會直接影響到虛擬機的運行性能和穩(wěn)定性。若內(nèi)存分配
    的頭像 發(fā)表于 01-24 15:22 ?941次閱讀
    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:語言擴展:內(nèi)存存儲類型、ASM和內(nèi)聯(lián)構(gòu)造

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

    云計算環(huán)境下的IP地址分配方式

    提供商為用戶提供的各種云資源分配網(wǎng)絡(luò)標識,以實現(xiàn)云資源之間以及云資源與外部網(wǎng)絡(luò)的通信。云計算通常包括基礎(chǔ)設(shè)施即服務(wù)、平臺即服務(wù)和軟件即服務(wù)等多種服務(wù)模式,不同模式下IP地址分配方式也有所不同。 IaaS模式下的IP地址
    的頭像 發(fā)表于 12-19 14:02 ?733次閱讀

    邏輯異或運算在Python中的用法

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

    如何優(yōu)化RAM內(nèi)存使用

    :使用任務(wù)管理器查看當前運行的程序和服務(wù),關(guān)閉那些不需要的。 禁用啟動程序 :減少開機啟動項,保留必要的程序。 2. 優(yōu)化操作系統(tǒng)設(shè)置 調(diào)整虛擬內(nèi)存 :合理設(shè)置虛擬內(nèi)存,避免過多占
    的頭像 發(fā)表于 11-11 09:58 ?2205次閱讀