C 記憶體分配粗略概覽

2021-09-24 04:37:13 字數 1303 閱讀 9173

尾語在c++記憶體分配方面,會見到很多操作:new、delete、new、delete、operator new、 operator delete、malloc、 free、 stl裡的 allocator、deallocator,甚至linux核心中的 slab allocator、kmalloc、vmalloc。 種類繁多,眼花繚亂。本文就大概捋一下整體的關係。

圖中是相對明了的,但只是大概的層級關係。還有些特殊情況。

在我們編寫程式時,之前提的所有的分配(系統呼叫視系統而定)都可以拿來直接用,但是它們之中又分了很多層級。

stl內有自己的allocator,但是有很多種,有些是簡單的封裝呼叫了operator new,有些則實現了乙個記憶體池(stl原始碼剖析裡的alloc),而記憶體池需要記憶體時根據malloc獲取記憶體。

我們經常用的new內部是呼叫operator new 和物件的建構函式。

全域性的operator new 呼叫了malloc 並且還有malloc失敗時的new_handle函式(可以設定)。(operator new可以過載,一般有需求會在類內過載。過載全域性的operator new有一定風險,就不細說了)

malloc在不同庫中會有不同的實現。glibc中是ptmalloc2,其他庫還有各種比較好的實現。並且基本上malloc實現又是一種記憶體池(比之前提的alloc,要複雜的多,畢竟malloc作用範圍比alloc要廣的多,也是很多有實力的技術團隊在不斷研究改進的成果)

在linux裡,malloc底層又呼叫了系統內的brk和mmap來分配記憶體。

kmalloc和vmalloc則是linux核心中實現,kmalloc分配實體地址連續且虛擬位址連續的記憶體,vmalloc分配實體地址不連續,虛擬位址連續的記憶體。所以vmalloc會慢(與匯流排協議,ddr硬體本身的特性有關(訪問不同塊需要預充電等))

kmalloc則是從slab allocator獲取記憶體,而slab則又是一種記憶體池結構。

本文只是粗略的概述了大部分記憶體分配函式或操作的關係,每種自身又有很多可以深挖的細節。想把它們理清楚,是需要幾本書才可以的。特別是不同庫中malloc的實現(對於多執行緒的優化手段,為了分配和**效率的複雜結構設計,**的記憶體碎片的合併技巧,等等)

記憶體分配是c++程式設計師不得不了解的知識,尤其是當需要實現自己的記憶體池時,必須要知道底層已經做了哪些工作了,我們在上層寫的記憶體池還能做哪些工作,還需要做哪些工作。不然,很可能你實現的功能,底層已經幫你做了,而你所做的效率可能還不如底層分配的效率,無謂而且有害。

以上

C 記憶體分配

總結 1 從靜態儲存區域分配。內存在程式編譯的時候就已經分配好,這塊內存在程式的整個執行期間都存在。例如全域性變數,static變數。2 在棧上建立。在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函式執行結束時這些儲存單元自動被釋放。棧記憶體分配運算內置於處理器的指令集中,效率很高,但是...

C 記憶體分配

c 中的記憶體主要分為五塊 全域性區 static 存放全域性變數或靜態變數 常量區 const 存放常量,不允許修改 可以通過特殊手段修改 堆 heap 由使用者自行分配和釋放,在程式執行時分配。由malloc分配,由free釋放 自由儲存區 free store 由new分配,由delete釋放...

C 記憶體分配

在c 中,記憶體分成4個區,他們分別是堆,棧,靜態儲存區和常量儲存區 1 棧,就是那些由編譯器在需要的時候分配,在不需要的時候自動清除的變數的儲存區.裡面的變數通常是區域性變數,函式引數等.2 堆,又叫自由儲存區,它是在程式執行的過程中動態分配的,它最大的特性就是動.態性.由new分配的記憶體塊,他...