国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

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

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

3天內不再提示

如何讓new操作符不分配內存,只構造

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

掃碼添加小助手

加入工程師交流群

【導讀】:本文主要介紹如何讓new操作符不分配內存,只構造。

問題

c++中的new操作符通常完成兩個工作分配內存及調用相應的構造函數。

請問:

如何讓new操作符不分配內存,只調用構造函數?

這樣的用法有什么用?

placement new的含義

placement new可以實現不分配內存,只調用構造函數。

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

placement new的執行忽略了size_t參數,只返還第二個參數。

其結果是允許用戶把一個對象放到一個特定的地方,達到調用構造函數的效果。

用法如下:

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

輸出:

Constructor Constructor Destructor

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

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

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

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

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

new 、operator new 和 placement new 區別

new :不能被重載,其行為總是一致的。它先調用operator new分配內存,然后調用構造函數初始化那段內存。

operator new:要實現不同的內存分配行為,應該重載operator new,而不是new。

delete和operator delete類似。delete首先調用對象的析構函數,然后調用operator delete釋放掉所使用的內存。

placement new:只是operator new重載的一個版本。它并不分配內存,只是返回指向已經分配好的某段內存的一個指針。因此不能刪除它,但需要調用對象的析構函數。

new 操作符的執行過程

調用operator new分配內存 ;

調用構造函數生成類對象;

返回相應指針。

placement new允許你在一個已經分配好的內存中(棧或者堆中)構造一個新的對象。原型中void*p實際上就是指向一個已經分配 好的內存緩沖區的的首地址。

Placement new 存在的理由

用Placement new 解決buffer的問題

問題描述:

用new分配的數組緩沖時,由于調用了默認構造函數,因此執行效率上不佳。若沒有默認構造函數則會發生編譯時錯誤。如果你想在預分配的內存上創建對象,用缺省的new操作符是行不通的。要解決這個問題,你可以用placement new構造。它允許你構造一個新對象到預分配的內存上。

增大時空效率的問題

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

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

使用步驟

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

第一步 緩存提前分配

有三種方式:

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

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

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

在棧上進行分配

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

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

void*buf=reinterpret_cast(0xF00F);

第二步:對象的分配

在剛才已分配的緩存區調用placement new來構造一個對象。

Task*ptask=new(buf)Task

第三步:使用

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

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

第四步:對象的析構

一旦你使用完這個對象,你必須調用它的析構函數來毀滅它。按照下面的方式調用析構函數:

ptask->~Task();//調用外在的析構函數

第五步:釋放

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

delete[]buf;

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

性能對比

采用placement new和new的方式創建和刪除對象一萬次,統計時間,單位是us。

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

結果:

placementnew:186 new:1448

結論:在頻繁構造和析構對象的場景中,placement new對性能有7倍的提升。

責任編輯:lq

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

    關注

    6

    文章

    2227

    瀏覽量

    48887
  • 函數
    +關注

    關注

    3

    文章

    4417

    瀏覽量

    67517
  • 應用程序
    +關注

    關注

    38

    文章

    3344

    瀏覽量

    60259

原文標題:如何讓 new 操作符只構造,不申請內存

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

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    keil中c語言的動態分配內存

    在C程序中,通常將內存劃分為以下六個區域: (1)內核區域。這塊區域是操作系統的,用戶不能使用。 (2)棧區。主要用于存放運行函數而分配的局部變量、函數參數、返回數據、返回地址等。棧內存
    發表于 01-21 06:04

    【「Linux 設備驅動開發(第 2 版)」閱讀體驗】+讀深入理解Linux內核內存分配

    每個內存地址是虛擬的,不是直接指向RAM中的任何地址。當用戶訪問內存中的存儲單元時,都會進行地址轉換以匹配相應的物理內存。書籍的第10章討論了五個主題,對Linux內核內存
    發表于 01-16 20:05

    C語言指針p、*p、&amp;p、*&amp;p、&amp;*p分別代表什么

    的數據類型。例如,int *p; 定義了一個指向int類型變量的指針變量p。 *p:解引用操作符。它用于訪問指針所指向的變量的值。例如,*p = 10; 將10賦值給p所指向的變量。 p:取地址操作符
    發表于 01-07 07:34

    如何在TensorFlow Lite Micro中添加自定義操作符(1)

    相信大家在部署嵌入式端的AI應用時,一定使用過TensorFlow Lite Micro,以下簡稱TFLm。TFLm 是專為微控制器和嵌入式設備設計的輕量級機器學習推理框架,它通過模塊化的操作符系統
    的頭像 發表于 12-26 10:34 ?5340次閱讀

    嵌入式系統中,動態分配內存可能發生的問題是什么?

    盡管不像非嵌入式計算機那么常見,嵌入式系統還是有從堆(heap)中動態分配內存的過程的。 那么嵌入式系統中,動態分配內存可能發生的問題是什么? 這 里,我期望應試者能提到
    發表于 12-22 09:42

    從代碼執行看單片機內存分配

    怎么分配和存儲的,這些問題都和內寸有關系。 首先,單片機的內存可以大小分為ram和rom,這里就不再解釋ram和rom的區別了,我們可以將其等效為flash和sram,其中根據flash和sram的定義
    發表于 12-02 07:58

    C語言位操作符

    C 語言位操作符包括按位與( )、按位或(|)、按位異或(^)、按位取反(~)、左移(<<)和右移(>>)。 按位與( ) 只有當兩個二進制位
    發表于 11-21 07:52

    FAQ_MA35_Family M4 RAM如何調整M4的內存分配

    FAQ_MA35_Family M4 RAM如何調整M4的內存分配
    發表于 09-02 06:07

    靈活高效ZBUFF — C內存數據操作庫:優化內存管理的利器

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

    靈活高效雙引擎驅動:ZBUFFC語言內存操作更智能!

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

    linux系統awk特殊字符命令詳解

    在Linux系統中,awk?是一種非常強大的文本處理工具,能夠對文本數據進行分析、格式化和篩選。利用其內置的特殊字符和操作符,用戶可以實現復雜的數據處理任務。以下對一些常見的awk特殊字符和操作符
    的頭像 發表于 07-28 16:38 ?644次閱讀

    千方科技推出AI大模型公路構造物評定系統

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

    如何使用LAX_CODEGEN啟用動態內存分配

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

    如何查看S32DS中S32平臺的內存分配

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

    golang內存分配

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