2012-12-08 16 views
0

我目前正在爲基於分配器概念的C++編寫一個內存管理庫。這是比較簡單的,就目前而言,所有分配器實現這兩個成員函數:分配器庫中每個分配開銷較小

virtual void * alloc(std::size_t size) = 0; 
virtual void dealloc(void * ptr) = 0; 

正如你所看到的,我不支持在界面排列,但是這實際上是我的下一個步驟:)爲什麼我的原因問這個問題。

我希望分配器負責對齊,因爲每個分配器都可以是專用的。例如,塊分配器只能返回塊大小對齊的內存,以便處理故障並在需要不同的對齊時返回NULL。

我的一些分配器其實是次分配器。例如,其中一個是線性/順序分配器,它只是指向分配的指針。這個分配器是通過傳入一個char * pBegin和char * pEnd來構造的,它在內存中從該區域內分配。目前來說,它工作的很好,但我得到的東西是1字節對齊的。它適用於x86,但是我聽說在其他CPU(控制檯?)上可能會造成災難性後果。在x86上的讀取和寫入也稍慢。

我知道實現對齊的內存管理的唯一明智的方法就是分配額外的sizeof(void *的)+(alignement - 1)個字節,並做指針位掩蔽,同時保留了原有分配的地址返回對齊的地址用戶數據之前的字節(void *字節,參見上文)。

OK,我的問題...

那開銷,每個分配中,似乎大了我。對於4字節對齊,我將在32位cpu上有7個字節的開銷,在64位上有11個字節。這似乎很多。

首先,它是很多?我是否與其他內存管理庫相提並論,您可能已經使用過或目前正在使用它?我研究過malloc,它似乎有至少16字節的開銷,是嗎?

你知道更好的方法,更小的開銷,返回對齊的內存到我的lib的用戶嗎?

+0

我不認爲你可以做任何有關填充的內容......你可以使用一些填充字節作爲頭(如果你做任何記錄)爲你的下一個分配,仍然保持8字節對齊,但這聽起來難以置信的棘手。 – Cornstalks

+0

爲每個隊列使用不同的分配器。然後你有0填充。大多數分配器對齊,所以雙精度對齊。如果double是8個字節,那麼就有用於1,2,4和8個字節對齊的分配器。 –

回答

1

您可以存儲偏移量而不是指針,它只需要足夠大以存儲最大的受支持對齊。如果你只支持小的對齊,那麼一個字節可能就足夠了。

+0

不幸的是這是一個糟糕的主意。它並沒有告訴你足夠的計算偏移回到分配的開始。 – JasonD

0

如何根據您的要求實現可以x字節對齊的夥伴系統。

一般的思想:

  1. 當你的LIB初始化,分配的內存大塊。對於我們的例子,我們假設16B。 (只有此塊需要對齊,算法不會要求您對齊任何其他塊)
  2. 維護權力2的內存塊的列表,即4B,8B,16B,... 64KB,... 1MB, 2MB,... 512MB。
  3. 如果用戶要求輸入8B的數據,請檢查8B的列表(如果不可用),檢查16B的列表並將其拆分爲8B的2個塊。讓一個回到用戶,另一個回到8B的列表。
  4. 如果用戶要求16B,請檢查您是否至少有2 8B可用。如果是的話,將它們合併並給予用戶。如果不是,則系統沒有足夠的內存。

優點:

  1. 無內部或外部碎片。
  2. 不需要對齊。
  3. 快速訪問內存塊,因爲它們是預先分配的。
  4. 如果列表是一個數組,直接訪問不同大小的存儲器塊

缺點:

  1. 開銷的存儲器列表。
  2. 如果列表是鏈接列表,則遍歷速度會很慢。
+0

我的一個分配器是一個二進制好友分配器,但我專注於針對此問題的更簡單的基於指針緩衝區的分配器。 – binarez