我目前正在爲基於分配器概念的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的用戶嗎?
我不認爲你可以做任何有關填充的內容......你可以使用一些填充字節作爲頭(如果你做任何記錄)爲你的下一個分配,仍然保持8字節對齊,但這聽起來難以置信的棘手。 – Cornstalks
爲每個隊列使用不同的分配器。然後你有0填充。大多數分配器對齊,所以雙精度對齊。如果double是8個字節,那麼就有用於1,2,4和8個字節對齊的分配器。 –