2011-01-09 146 views
15

我聽說過有人爲自己的項目使用自定義內存分配器,特別是C++。C++:內存分配器

  • 什麼是自定義內存分配器,與malloc相比?

  • 是不是malloc已經是最低級別了?

+1

@muntoo:這完全不提分配器。 – jalf 2011-01-10 00:18:03

+0

@jalf我還在學習如何閱讀。 – 2011-01-10 00:49:20

回答

18

甲內存分配器不是較低水平malloc。 (默認分配器通常直接或間接呼叫malloc

分配器只允許您指定不同的分配策略。例如,您可以使用一次調用malloc的分配器來檢索大量內存池,然後對於後續的分配請求,它只返回該池中的一小塊。

或者您可以將它用作鉤子,以便您在每次分配內存或釋放內存時執行一些額外的任務。

至於你的第二個問題,malloc是你可以走的最低而不會丟失可移植性。 malloc通常使用一些OS特定的內存分配函數來實現,因此它仍然是較低的級別。但這與你的主要問題無關,因爲C++分配器是更高級別的抽象。

+1

+ 1-有許多分配策略,malloc只是一個儘可能具有普遍性能的分配策略。 – Puppy 2011-01-10 00:34:12

5

自定義內存分配器是malloc(實際上,通常代替operator new)的替代品,它以非默認方式檢索字節塊。 malloc不是您可以去的最低級別,因爲malloc本身是通過操作系統中更簡單的基元來實現的,這些基元爲分區分配內存塊。

制定自定義分配器的常用用例針對小對象的分配進行了優化(默認分配器通常非常糟糕),以確保良好局部性的方式進行分配(通過將對象分配給另一個對象),使用logging /跟蹤(用於診斷泄漏),從垃圾收集資源池中分配等等。有很多不同的選項可供選擇,許多程序可以使用這些自定義分配器來提高性能。

1

malloc()是libc(或glibc)中的一個庫函數,它在系統調用sbrk()時需要實際分配更多內存給進程。 malloc()和free()管理malloc(),calloc()等被調用時使用的內存塊列表。

當不需要malloc()的行爲或者您想在malloc/free之上做額外的工作時,您可以使用自定義分配器。

16

下面的文章(我寫的)中有對自定義分配器的廣泛描述以及他們的經驗性評估。在您決定在您的 C++項目中使用自定義分配器之前,您應該閱讀本文。執行概述是好的通用分配器比除地區之外的所有樣式的自定義分配器更好(更快且更節省空間),但這些分配器存在嚴重問題

反思定製內存分配ACM linkdirect PDF linkPowerpoint talk slides)2002年OOPSLA。

程序員希望實現 性能改進通常使用 自定義內存分配器。這個深入研究的 檢查使用定製 分配器的八個 應用程序。令人驚訝的是,對於 這六個應用程序,最新的 通用分配器(Lea 分配器)的性能好於自定義分配器,或者性能分配器的性能好於 。 兩個例外使用區域,其中 提供更高的性能 (改進高達44%)。地區 也減少程序員的負擔和 消除內存泄漏的來源。然而,我們表明, 程序員無法在區域內釋放個別對象 可能導致內存消耗的大幅增加 。更糟的是,這種限制 排除了 常見的編程風格使用的區域,減少 他們usefulness.We呈現 概括的通用和 基於區域的分配器,我們稱之爲 人收割。收割是 區域和堆的組合,提供完整的 範圍的區域語義與 添加個別對象 刪除。我們表明,我們的 實施收益提供了高性能,優於其他 分配器與區域般的語義。 然後我們用一個案例研究來證明 在實踐中的空間優勢和 軟件工程帶來的收益 的好處。我們的結果表明 需要快速區域 的程序員應該使用reaps,而且大多數考慮自定義 分配器的程序員應該使用分配器來使用Lea 。