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

标签 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;
        }
    }

我希望它快点。我怀疑打给new的无数次电话和 delete会很慢。

池分配器似乎是个不错的选择。然而,我对分配器的经验都是在对象容器的上下文中(例如声明一个 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 的分配所做的任何更改都是正确的s 将被隔离到那个问题,而不是 std::map .

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

如果您的代码如上所示,并且您总是删除从 map 中删除的元素,您可以考虑插入 Foo直接进入映射而不是使用指针,这可能会减少分配次数。此外,如果您使用的是 C++11,您可能需要考虑一个智能指针,例如 std::unique_ptr。 (或者 std::shared_ptr 如果您希望同一个 Foo* 与多个键相关联。)

关于指针存储在容器中的对象的 C++ 分配器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29196543/

相关文章:

memory - 不可逐出的页面有什么特殊之处?

c++ - 如果对象位于可能的最高地址怎么办

C——在释放内存时将字符串数据插入链表会使程序崩溃

c - 调用malloc()和free()时寄存器/缓存和主存之间是否有数据传输

c++ - 有什么方法可以识别流?

c++ - 用模板函数重载模板类

algorithm - 并发重读工作负载的数据结构

Docker 镜像大于其文件系统

c++ - 通过函数指针从外部文件调用静态函数的坏习惯?

c++ - C++ 中可选的 ofstream 参数