亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C++ 自由存儲區(qū)是否等價于堆你知道嗎

 更新時間:2021年08月31日 18:09:14   作者:melonstreet  
自由存儲是C++中通過new與delete動態(tài)分配和釋放對象的抽象概念,而堆(heap)是C語言和操作系統(tǒng)的術(shù)語,是操作系統(tǒng)維護的一塊動態(tài)分配內(nèi)存

free store” VS “heap”

當(dāng)我問你C++的內(nèi)存布局時,你大概會回答:

“在C++中,內(nèi)存區(qū)分為5個區(qū),分別是堆、棧、自由存儲區(qū)、全局/靜態(tài)存儲區(qū)、常量存儲區(qū)”。

如果我接著問你自由存儲區(qū)與堆有什么區(qū)別,你或許這樣回答:

“malloc在堆上分配的內(nèi)存塊,使用free釋放內(nèi)存,而new所申請的內(nèi)存則是在自由存儲區(qū)上,使用delete來釋放?!?/p>

這樣聽起來似乎也沒錯,但如果我接著問:

自由存儲區(qū)與堆是兩塊不同的內(nèi)存區(qū)域嗎?它們有可能相同嗎?

你可能就懵了。

事實上,我在網(wǎng)上看的很多博客,劃分自由存儲區(qū)與堆的分界線就是new/delete與malloc/free。然而,盡管C++標(biāo)準(zhǔn)沒有要求,但很多編譯器的new/delete都是以malloc/free為基礎(chǔ)來實現(xiàn)的。那么請問:借以malloc實現(xiàn)的new,所申請的內(nèi)存是在堆上還是在自由存儲區(qū)上?

從技術(shù)上來說,堆(heap)是C語言和操作系統(tǒng)的術(shù)語。堆是操作系統(tǒng)所維護的一塊特殊內(nèi)存,它提供了動態(tài)分配的功能,當(dāng)運行程序調(diào)用malloc()時就會從中分配,稍后調(diào)用free可把內(nèi)存交還。而自由存儲是C++中通過new和delete動態(tài)分配和釋放對象的抽象概念,通過new來申請的內(nèi)存區(qū)域可稱為自由存儲區(qū)?;旧?,所有的C++編譯器默認(rèn)使用堆來實現(xiàn)自由存儲,也即是缺省的全局運算符new和delete也許會按照malloc和free的方式來被實現(xiàn),這時藉由new運算符分配的對象,說它在堆上也對,說它在自由存儲區(qū)上也正確。但程序員也可以通過重載操作符,改用其他內(nèi)存來實現(xiàn)自由存儲,例如全局變量做的對象池,這時自由存儲區(qū)就區(qū)別于堆了。我們所需要記住的就是:

堆是操作系統(tǒng)維護的一塊內(nèi)存,而自由存儲是C++中通過new與delete動態(tài)分配和釋放對象的抽象概念。堆與自由存儲區(qū)并不等價。

問題的來源

再回過頭來來看看這個問題的起源在哪里。最先我們使用C語言的時候,并沒有這樣的爭議,很明確地知道m(xù)alloc/free是在堆上進行內(nèi)存操作。直到我們在Bjarne Stroustrup的書籍中數(shù)次看到free store (自由存儲區(qū)),說實話,我一直把自由存儲區(qū)等價于堆。而在Herb Sutter的《exceptional C++》中,明確指出了free store(自由存儲區(qū)) 與 heap(堆) 是有區(qū)別的。關(guān)于自由存儲區(qū)與堆是否等價的問題討論,大概就是從這里開始的:

Free Store
The free store is one of the two dynamic memory areas, allocated/freed by new/delete. Object lifetime can be less than the time the storage is allocated; that is, free store objects can have memory allocated without being immediately initialized, and can be destroyed without the memory being immediately deallocated. During the period when the storage is allocated but outside the object's lifetime, the storage may be accessed and manipulated through a void* but none of the proto-object's nonstatic members or member functions may be accessed, have their addresses taken, or be otherwise manipulated.

Heap
The heap is the other dynamic memory area, allocated/freed by malloc/free and their variants. Note that while the default global new and delete might be implemented in terms of malloc and free by a particular compiler, the heap is not the same as free store and memory allocated in one area cannot be safely deallocated in the other. Memory allocated from the heap can be used for objects of class type by placement-new construction and explicit destruction. If so used, the notes about free store object lifetime apply similarly here.

來源:http://www.gotw.ca/gotw/009.htm

作者也指出,之所以把堆與自由存儲區(qū)要分開來,是因為在C++標(biāo)準(zhǔn)草案中關(guān)于這兩種區(qū)域是否有聯(lián)系的問題一直很謹(jǐn)慎地沒有給予詳細(xì)說明,而且特定情況下new和delete是按照malloc和free來實現(xiàn),或者說是放過來malloc和free是按照new和delete來實現(xiàn)的也沒有定論。這兩種內(nèi)存區(qū)域的運作方式不同、訪問方式不同,所以應(yīng)該被當(dāng)成不一樣的東西來使用。

結(jié)論

  • 自由存儲是C++中通過new與delete動態(tài)分配和釋放對象的抽象概念,而堆(heap)是C語言和操作系統(tǒng)的術(shù)語,是操作系統(tǒng)維護的一塊動態(tài)分配內(nèi)存。
  • new所申請的內(nèi)存區(qū)域在C++中稱為自由存儲區(qū)。藉由堆實現(xiàn)的自由存儲,可以說new所申請的內(nèi)存區(qū)域在堆上。
  • 堆與自由存儲區(qū)還是有區(qū)別的,它們并非等價。

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • 深入全排列算法及其實現(xiàn)方法

    深入全排列算法及其實現(xiàn)方法

    本篇文章是對全排列算法及其實現(xiàn)方法進行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • opencv檢測直線方法之投影法

    opencv檢測直線方法之投影法

    這篇文章主要為大家詳細(xì)介紹了opencv檢測直線之投影法的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • opencv檢測直線方法之形態(tài)學(xué)方法

    opencv檢測直線方法之形態(tài)學(xué)方法

    這篇文章主要為大家詳細(xì)介紹了opencv檢測直線方法之形態(tài)學(xué)方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • C++序列操作函數(shù)學(xué)習(xí)最全指南

    C++序列操作函數(shù)學(xué)習(xí)最全指南

    這篇文章主要給大家介紹了關(guān)于C++序列操作函數(shù)學(xué)習(xí)的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用C++具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2022-02-02
  • c++異常處理機制示例及詳細(xì)講解

    c++異常處理機制示例及詳細(xì)講解

    本篇文章主要是對c++異常處理機制示例進行了介紹,需要的朋友可以過來參考下,希望對大家有所幫助
    2014-02-02
  • 淺談c++11閉包的實現(xiàn)

    淺談c++11閉包的實現(xiàn)

    閉包有很多種定義,一種說法是,閉包是帶有上下文的函數(shù)。說白了,就是有狀態(tài)的函數(shù)。更直接一些,不就是個類嗎?換了個名字而已。本文將介紹c++11閉包的實現(xiàn),感興趣的同學(xué),可以參考下。
    2021-06-06
  • C語言實現(xiàn)Fibonacci數(shù)列遞歸

    C語言實現(xiàn)Fibonacci數(shù)列遞歸

    這篇文章主要介紹了C語言實現(xiàn)Fibonacci數(shù)列遞歸,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • C++之list容器介紹及使用方式

    C++之list容器介紹及使用方式

    這篇文章主要介紹了C++之list容器介紹及使用方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • 利用boost獲取時間并格式化的方法

    利用boost獲取時間并格式化的方法

    下面小編就為大家?guī)硪黄胋oost獲取時間并格式化的方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-03-03
  • C++中棧結(jié)構(gòu)建立與操作詳細(xì)解析

    C++中棧結(jié)構(gòu)建立與操作詳細(xì)解析

    我們可以把棧理解成一個大倉庫,放在倉庫門口(棧頂)的貨物會優(yōu)先被取出,然后再取出里面的貨物。而從數(shù)據(jù)的邏輯結(jié)構(gòu)來看,棧結(jié)構(gòu)起始就是一種線性結(jié)構(gòu)
    2013-10-10

最新評論