[英]C++ allocator for objects whose pointers are stored in containers
我有一個map<int, Foo *>
,我需要在其中插入和刪除Foo *
。 用法看起來像
map<int, Foo *> mapping;
while( a long time)
{
// make new Foo and insert into mapping
Foo * foo = new Foo( some params)
mapping.emplace(foo->getID(), foo);
// sometimes we'd get an existing Foo and remove it
if ( sometimes)
{
int deleteThisID = getIDToDelete();
Foo * deleteFoo = mapping.find(deleteThisID)->second;
mapping.erase(deleteThisID);
delete deleteFoo;
}
}
我希望它快。 我懷疑對new
和delete
的大量調用會很慢。
池分配器似乎是一個不錯的選擇。 但是,我對分配器的經驗都是在對象容器的上下文中進行的(例如,聲明map<int, Foo, std::allocator<std::pair<int, Foo>>>
這不相關。
我應該得到一個池分配器,而不是new Foo()
並delete foo
,而不是alloc.allocate
和alloc.destroy
嗎? 新代碼不應觸摸map<int, Foo *>
本身,對嗎?
Foo*
的分配方式與std::map<X, Foo*>
的實例無關,因此您正確地認為,為改善Foo
的分配所做的任何更改都將與該問題無關,而不是與std::map
無關std::map
。
當然, std::map
還會為每個元素分配一個分配(並在刪除元素時進行相應的釋放),因此您也可以考慮替換用於std::map
的分配器以嘗試提高性能。 這將取決於所使用的標准庫的性能,這只能通過基准測試來確定。
如果您的代碼如上所示,並且您始終要刪除從映射中刪除的元素,則可以考慮直接將Foo
插入到映射中,而不是使用指針,這可能會減少分配數量。 另外,如果您使用的是C ++ 11,則可能需要考慮一個智能指針,例如std::unique_ptr
(如果希望同一Foo *與多個鍵相關聯,則可以使用std::shared_ptr
。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.