指针存储在容器中的对象的 C++ 分配器
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
以尝试获得性能改进。这将取决于所使用的标准库的性能,只能通过基准测试来确定。
如果您的代码如上所示,并且您总是删除从地图中删除的元素,您可以考虑将 Foo
直接插入地图而不是使用指针,这可能会减少分配次数.此外,如果您使用的是 C++11,您可能需要考虑一个智能指针,例如 std::unique_ptr
(或者 std::shared_ptr
,如果您希望同一个 Foo* 与多个键相关联。)
我有一个 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
以尝试获得性能改进。这将取决于所使用的标准库的性能,只能通过基准测试来确定。
如果您的代码如上所示,并且您总是删除从地图中删除的元素,您可以考虑将 Foo
直接插入地图而不是使用指针,这可能会减少分配次数.此外,如果您使用的是 C++11,您可能需要考虑一个智能指针,例如 std::unique_ptr
(或者 std::shared_ptr
,如果您希望同一个 Foo* 与多个键相关联。)