小型物件記憶體分配

2021-05-22 09:46:05 字數 1322 閱讀 4345

c++

語法中動態分配和指標/引用的使用非常普遍,然而預設的自由儲存區分配器(比如::operator new和::operator delete)只適用於大物件對分配,對小物件分配並不有效,甚至非常低劣,多次分配小物件後容易產生碎片。

小型物件分配器

小型物件分配器分為

4層結構。如圖所示,下層提供功能供上層使用。

+-------------------+

|    smallobject    |

+-------------------+

| smallobjallocator |

+-------------------+

|   fixedallocator  |

+-------------------+

|       chunk       |

+-------------------+

最下層是

chunk

物件,每乙個

chunk

管理一大塊記憶體,此大塊記憶體包含整數個固定大小的區塊。可以用來分配和歸還,當其中沒有剩餘時,分配失敗返回零。

第二層是

fixallocator class

,其以chunk

為構件。主要用來滿足那些

「累計總量超過

chunk容量」

的請求。

fixallocator

通過乙個

array

(實際是

vector

)組合chunks

。如果所有

chunk

都被使用,

fixallocator

分配新chunk

,並加入

array

,來滿足需求。

第三層是

smallobjectallocator

提供通用分配

/歸還函式。擁有數個

fixedallocator

物件,每個負責分配某特定大小物件。根據申請

bytes

個數不同,

smallobjallocator

物件會將記憶體分配申請分發。如果請求量過大,會轉交系統

new。

第四層是

smallobject

,它包裝

fixedallocator

,以便向

c++ classes

提供封裝良好的分配服務。

smallobject

過載new

和delete

。你只需要讓你的物件派生於

smallobject

C 物件記憶體分配問題

轉 c 將記憶體劃分為三個邏輯區域 堆 棧和靜態儲存區。既然如此,我稱位於它們之中的物件分別為堆物件,棧物件以及靜態物件。先來看看棧。棧,一般用於存放區域性變數或物件,如我們在函式定義中用類似下面語句宣告的物件 type stack object stack object便是乙個棧物件,它的生命期是...

物件陣列 簡單記憶體分配

1 第一行 在棧記憶體中宣告了乙個物件陣列的引用 名字 然後在堆記憶體中分配了6個student型別的空間,同時將每乙個空間初始化,初始化值為null,最後將位址賦給student陣列,最後student陣列指向對應的記憶體空間。2 第二行 1 首先在堆記憶體中分配了乙個空間,然後呼叫它的建構函式。...

類物件的記憶體分配

類的大小一般是指經過例項化後類物件的大小。1真空類 長度 1 class a 2空類 長度1,同真空類。class a public a a void fun 成員函式不會影響類的大小。3簡單類,長度4 class a 4有虛函式的類 長度 4 class a 注1 虛函式表 如果基類派生類定義了虛...