用于指针存储在容器中的对象的C ++分配器

时间:2015-03-22 15:59:31

标签: c++ memory-management containers allocator

我有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 *>本身,对吧?

1 个答案:

答案 0 :(得分:1)

Foo*的分配方式与std::map<X, Foo*>的实例无关,因此您认为为改善Foo的分配所做的任何更改都将与此问题隔离开来,而不是std::map

当然,std::map 为每个元素进行分配(以及在删除元素时进行后续释放),因此您还可以考虑替换用于{{{ 1}}尝试获得性能提升。这取决于所使用的标准库的性能,这只能通过基准测试来确定。

如果您的代码是如图所示并且您始终删除从地图中删除的元素,则可以考虑将std::map直接插入地图而不是使用指针,这可能会减少分配数量。此外,如果您使用的是C ++ 11,则可能需要考虑智能指针,例如Foo(或std::unique_ptr,如果您希望将相同的Foo *与多个密钥相关联。)