我有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 *>
本身,对吧?
答案 0 :(得分:1)
Foo*
的分配方式与std::map<X, Foo*>
的实例无关,因此您认为为改善Foo
的分配所做的任何更改都将与此问题隔离开来,而不是std::map
。
当然,std::map
也为每个元素进行分配(以及在删除元素时进行后续释放),因此您还可以考虑替换用于{{{ 1}}尝试获得性能提升。这取决于所使用的标准库的性能,这只能通过基准测试来确定。
如果您的代码是如图所示并且您始终删除从地图中删除的元素,则可以考虑将std::map
直接插入地图而不是使用指针,这可能会减少分配数量。此外,如果您使用的是C ++ 11,则可能需要考虑智能指针,例如Foo
(或std::unique_ptr
,如果您希望将相同的Foo *与多个密钥相关联。)