2011-04-11 121 views
18

根據C++入門第4版,755頁,還有一張紙條寫着:C++ STL分配器VS運營商新

現代C++程序通常應該使用allocator類 分配內存。它更安全,更靈活。

我不太明白這句話。 到目前爲止,我讀到的所有材料都是用new來分配C++中的內存。 書中顯示了矢量類如何使用分配器的示例。 但是,我想不出其他情況。

任何人都可以幫助澄清此聲明?並給我更多的例子? 什麼時候應該使用分配器,何時使用new?謝謝!

回答

35

對於一般編程,是的,您應該使用newdelete

但是,如果你正在編寫一個庫,你不應該! 我沒有你的教科書,但我想它是在編寫庫代碼的上下文中討論分配器。

圖書館的用戶可能想要控制從哪裏分配的內容。如果圖書館的所有分配都經過了newdelete,用戶將無法擁有精細的控制級別。

所有的STL容器都帶有一個可選的分配器模板參數。然後容器將使用該分配器來滿足其內部需求。默認情況下,如果省略分配器,它將使用std::allocator,其使用newdelete(具體而言,::operator new(size_t)::operator delete(void*))。

通過這種方式,該容器的用戶可以控制內存從何處分配,如果他們願意的話。

實現與STL使用自定義分配器和解釋的例子:Improving Performance with Custom Pool Allocators for STL

側面說明:的STL方法分配器在幾個方面是最優的。我建議閱讀Towards a Better Allocator Model來討論其中一些問題。

+4

對於「STL方法分配器是非最優的」加上「建立更好的分配器模型」的鏈接:) – 2011-04-11 22:14:23

+1

您提供的鏈接非常有幫助! – 2011-04-14 03:45:35

1

這兩者並不矛盾。分配器是STL庫的容器適配器用於分配內存塊以供對象使用的PolicyPattern或StrategyPattern。

這些分配器經常通過允許 *元素的範圍優化存儲器分配在一次要被分配,然後初始化成使用新 *物品放置到來自次級,專門堆取決於塊大小

一種方式來選擇或其他,最終結果將(幾乎總是)是該對象與新的(位置或默認)分配


另一個生動的例子是如何如增強庫實現智能指針。由於智能指標非常小(開銷很小),分配開銷可能會成爲負擔。它將使意義的實現來定義一個專門的分配做了分配,這樣一個可能有高效的std ::設置<> smartpointers的,性病::地圖< ...,智能指針>等

(現在我幾乎可以肯定的是,通過避免任何虛擬,實際上大多數智能指針的存儲實際上都是優化的,因此vft使類成爲POD結構,只有原始指針作爲存儲;某些示例不適用,但是再次推斷到其他類型的智能指針(引用智能指針,指向成員函數,指向實例引用的成員函數的指針等))