簡體   English   中英

C++ STL 分配器與運算符 new

[英]C++ STL allocator vs operator new

根據 C++ Primer 4th edition, page 755,有一個注釋說:

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

我不太明白這個說法。 到目前為止,我閱讀的所有材料都使用new在 C++ 中分配內存。 書中展示了向量類如何使用分配器的示例。 但是,我想不出其他場景。

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

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

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

庫的用戶可能希望准確控制從何處分配的內容。 如果庫的所有分配都經過newdelete ,用戶將無法進行細粒度的控制。

所有 STL 容器都采用可選的分配器模板參數。 然后容器將使用該分配器來滿足其內部內存需求。 默認情況下,如果省略分配器,它將使用使用newdelete std::allocator (特別是::operator new(size_t)::operator delete(void*) )。

這樣,該容器的用戶可以根據需要控制從何處分配內存。

實現與 STL 一起使用的自定義分配器的示例,以及說明:使用 STL 的自定義池分配器提高性能

旁注:分配器的 STL 方法在幾個方面都不是最佳的。 我建議閱讀Towards a Better Allocator Model來討論其中的一些問題。

2019 年編輯:自從編寫此答案以來,C++ 中的情況有所改善。 C++11 支持有狀態分配器,並且在 C++17 中改進了這種支持。 參與“邁向更好的分配器模型”的一些人參與了這些更改(例如: N2387 ),這很好(:

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

這些分配器經常通過允許一次分配元素范圍來優化內存分配,然后根據塊大小使用從輔助、專用堆中選擇的新項目進行初始化

以一種或另一種方式,最終結果將(幾乎總是)是使用新的(放置或默認)分配對象


另一個生動的例子是 boost 庫如何實現智能指針。 由於智能指針非常小(開銷很小),分配開銷可能會成為負擔。 實現定義一個專門的分配器來進行分配是有意義的,因此一個人可能擁有高效的 std::set<> 智能指針、std::map<...、smartpointer> 等。

(現在我幾乎可以肯定 boost 實際上通過避免任何虛擬對象來優化大多數智能指針的存儲,因此 vft,使類成為 POD 結構,只有原始指針作為存儲;一些示例將不適用。但話又說回來,外推到其他類型的智能指針(引用智能指針、指向成員函數的指針、指向具有實例引用的成員函數的指針等))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM