簡體   English   中英

指針存儲在容器中的對象的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 還會為每個元素分配一個分配(並在刪除元素時進行相應的釋放),因此您也可以考慮替換用於std::map的分配器以嘗試提高性能。 這將取決於所使用的標准庫的性能,這只能通過基准測試來確定。

如果您的代碼如上所示,並且您始終要刪除從映射中刪除的元素,則可以考慮直接將Foo插入到映射中,而不是使用指針,這可能會減少分配數量。 另外,如果您使用的是C ++ 11,則可能需要考慮一個智能指針,例如std::unique_ptr (如果希望同一Foo *與多個鍵相關聯,則可以使用std::shared_ptr 。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM