2010-01-31 78 views
8

可能重複:
Any reason to overload global new and delete?你什麼時候重載operator new?

在什麼情況下,它可以完美地超負荷operator new

我聽說您在使用new經常分配的類做到這一點。你能給個例子嗎?

以及是否有其他情況下,你會想重載operator new

更新:感謝到目前爲止所有的答案。有人能給出一個簡短的代碼示例嗎?當我問到上面的一個例子時,這就是我的意思。像這樣:這是一個小玩具班,這裏是一個工作operator new該類。

+7

沒有試圖成爲一個沖洗,但有用的答案會發現與搜索:http://stackoverflow.com/questions/1152511/any-reason-to-overload-global-new-and-delete – Skurmedel 2010-01-31 15:08:45

+0

@Skurmedel:但那只是關於全球運營商新(和刪除)。一般來說,我是在問運營商的新業務是否過載,例如在一個班級。 – Frank 2010-01-31 15:12:03

+0

我不明白爲什麼其他原因會有所不同,除了不同的範圍。 – Skurmedel 2010-01-31 15:44:46

回答

3

我發現最好的情況是通過提供固定大小的塊的幾個堆,以防止堆碎片。即你創建一個完全由4個字節塊組成的堆,另一個包含8個字節塊等。

這比默認的'all in one'堆更好,因爲你可以重用塊,知道你的分配將會適合第一個空閒塊,而不必檢查或漫步堆尋找合適大小的空閒空間。

的缺點是,你使用更多的內存,如果您有一個4字節堆和一個8個字節的堆,並希望分配6個字節..你將不得不把它放在8-字節堆,浪費2個字節。現在,這不是什麼問題(特別是當你考慮替代方案的開銷時)

如果你有很多分配要做,你可以優化這個,你可以創建一個確切大小的堆。就個人而言,我認爲浪費幾個字節不是問題(例如,您分配了大量的7個字節,使用8個字節的堆不是什麼問題)。

我們這樣做了很高性能的系統,和它的工作奇妙,它降低了我們的性能問題,由於分配和堆碎片顯着,是完全透明的代碼的其餘部分。

+1

不確定你試過這個操作系統。但Windows堆管理器已經使用這種方法。如果別人不這樣做,我會感到驚訝。 – 2010-01-31 15:46:58

+1

C++內存管理針對快速出現和消失的小塊進行了優化。試圖重新優化它可能不適合你的普通程序員。上面提供的描述也是幾乎所有內存管理系統都使用的一種非常常見的方案。重新實施它將不會提供任何好處。 – 2010-01-31 18:59:55

+0

一般情況下,小塊分配優化工作到什麼樣的大小?我特別感興趣的是GCC的最新版本。 – 2010-01-31 20:14:56

0

你可以在你想控制某些對象的內存分配的情況下使用它。就像只有在堆中分配小對象時一樣,您可以爲1k對象分配空間,並使用新運算符先分配1k對象,然後使用該空間直至用完。

3

一些原因重載操作者新

  1. 跟蹤和內存分析,並檢測內存泄漏
  2. 要創建對象池(說對於粒子系統)來優化存儲器使用
11

每類超負荷的原因
1.儀表即跟蹤分配,調用者的審計跟蹤,如文件,線路,堆棧。
2.優化的分配例程,例如內存池,固定塊分配器。
3.專門的分配器i。e連續分配器,用於'在啓動時分配一次'對象 - 頻繁用於需要爲整個遊戲持續存儲的遊戲編程等。
4.對齊。對於大多數非桌面系統來說,這是一個很大的問題,尤其是在你經常需要分配的遊戲控制檯上。 16字節的邊界
5.專門的內存存儲(大部分非桌面系統),如不可緩存的內存或非本地內存

相關問題