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;
}
有沒有什麼辦法讓內存連續的塊又是對插入/刪除更有效?
我覺得你在找什麼叫做內存池。雖然(當然,它是C++)是可能的,但是可以正確實現。請參閱本文示例:https://isocpp.org/wiki/faq/dtors#memory-pools – CompuChip
爲什麼不使用['std :: vector'](http://en.cppreference.com/w/cpp /容器/矢量)來存儲所有的對象? – NathanOliver
'std :: vector'保證是連續的內存。如果你可以存儲索引而不是指針,那麼它可能適用於你。 –