2015-10-29 38 views
1

我有一個類型。我在我的應用程序的不同部分實例化它,但是我在某個地方循序遍歷所有這些部分。我不知道最終會有多少人。我如何創建一個分配器來存儲100個對象塊並按需提供指針?如何確保給定類型的每個100個對象都分配在連續內存中?

我曾嘗試這樣的方法用一個簡單的工廠類固醇但它goes over 5 seconds

#include <iostream> 
#include <vector> 
#include <unordered_map> 
#include <algorithm> 
#include <thread> 
#include <mutex> 

using namespace std; 

template<class T> 
struct Item { 
    T data; 
    bool alive = true; 
    int id = 0; 
}; 

template<class T> 
class ItemFactory { 
    vector<Item<T>> items; 
    unordered_map<int, int> item_ids; 
    unsigned int lastCounter=0; 
    int removedCounter=0; 
    mutex m; 

    public: 
    int CreateItem() { 
     lock_guard<mutex> l(m); 
     auto result = lastCounter++; 
     Item<T> item; 
     item.id = result; 
     items.push_back(item); 
     item_ids[result] = items.size()-1; 
     return result; 
    } 

    T& GetItem(int id) { 
     lock_guard<mutex> l(m); 
     return items[item_ids[id]].data; 
    } 

    void RemoveItem(int id) { 
     lock_guard<mutex> l(m); 
     items[item_ids[id]].alive = false; 
     removedCounter++; 

     if(removedCounter>=1000) { 
      removedCounter = 0; 
      auto end = remove_if(items.begin(), items.end(), [](const Item<T>& item){ 
       return !item.alive; 
      }); 
      items.erase(end, items.end()); 
      auto size = items.size(); 
      item_ids.clear(); 
      for(auto i = 0; i < size; i++) { 
       item_ids[items[i].id]=i; 
      } 
     } 
    } 

}; 

struct demo { 
    string bla; 
    float arr[256]; 
}; 

int main() { 
    ItemFactory<demo> f; 
    for(int i = 0; i < 50000; i++) { 
     auto id = f.CreateItem(); 
     auto id2 = f.CreateItem(); 
     auto & i1 = f.GetItem(id); 
     auto & i2 = f.GetItem(id2); 
     i1.bla = "abra kadabra bum"; 
     i2.bla = "bla bla bla"; 
     f.RemoveItem(id); 
    } 
    cout << "!!!" << endl; 
    for(int i = 0; i < 25000; i++) { 
     auto id = i + i*2; 
     auto & i1 = f.GetItem(id); 
     i1.bla = "abra kadabra bum"; 
     f.RemoveItem(id); 
    } 
    return 0; 
} 

有沒有什麼辦法讓內存連續的塊又是對插入/刪除更有效?

+0

我覺得你在找什麼叫做內存池。雖然(當然,它是C++)是可能的,但是可以正確實現。請參閱本文示例:https://isocpp.org/wiki/faq/dtors#memory-pools – CompuChip

+1

爲什麼不使用['std :: vector'](http://en.cppreference.com/w/cpp /容器/矢量)來存儲所有的對象? – NathanOliver

+3

'std :: vector'保證是連續的內存。如果你可以存儲索引而不是指針,那麼它可能適用於你。 –

回答

1

我會擡頭怎麼寫一個內存池分配,或者使用許多可用的,一個如升壓游泳池:http://www.boost.org/doc/libs/1_59_0/libs/pool/doc/html/index.html

C++11 memory pool design pattern?

在一般情況下,你分配的內存和手大塊當你需要它們時,指出你的指針;如果你知道你永遠不會釋放內存,它可以被優化。如果你總是需要連續的內存,即使你偶爾有空閒,你唯一可以做的就是重新分配內存和重新組合對象,如果經常這樣做可能會非常昂貴。

相關問題