指针存储在容器中的对象的 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;
        }
    }

我希望它快点。我怀疑多次调用 newdelete 会很慢。

池分配器似乎是个不错的选择。然而,我对分配器的经验都是在对象容器的上下文中(例如声明一个 map<int, Foo, std::allocator<std::pair<int, Foo>>>

这不相关。

我应该得到一个池分配器,而不是new Foo()delete foo,而是alloc.allocatealloc.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* 与多个键相关联。)