如何确保每100个给定类型的对象都被分配到连续内存中
How to make sure each 100 objects of given type are allocated in contiguous memory?
我有一个类型。我在应用程序的不同部分实例化它,但在某个位置按顺序迭代所有部分。我不知道最后会有多少。如何创建一个分配器来存储100个对象的块,并根据需要为我提供指针?
我已经尝试过这样的方法与一个简单的类固醇工厂,但它会超过5秒:
#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;
}
有没有什么方法可以让连续的内存块在插入/删除时更有效?
我会查找如何编写内存池分配器,或者使用许多可用的分配器之一,例如Boost pool:http://www.boost.org/doc/libs/1_59_0/libs/pool/doc/html/index.html
C++11内存池设计模式?
一般来说,您会分配大块内存,并根据需要分发指针;如果你知道你永远不会释放内存,那么它可以被优化。如果你真的一直需要连续内存,即使你偶尔会释放,你唯一能做的就是重新分配内存和重新排列对象,如果经常这样做的话,这可能会非常昂贵。
相关文章:
- 有没有一种方法可以使用placement new将堆叠对象分配给分配的内存
- C++ 如何在将新对象分配给另一个对象时创建新对象
- 为什么我可以在不重载 "=" 运算符的情况下将一个对象分配给另一个对象?
- 为对象分配整数.输出将是什么?
- C++ 使用枚举类对象分配 std::map 值
- 如何在C++中为增加但记住删除先前对象的对象分配唯一标识符
- 我重载了 << 和 = 运算符。为什么当我将一个对象分配给另一个对象并尝试打印它时,我会被打印出来?
- 为什么将两个对象分配给另一个对象后,两个对象不一样?
- 有没有办法在同名类 (c++) 中为对象分配一个指针变量
- 如何使用函数(而不是构造函数)将派生类对象分配给基类指针
- 是否可以使用 malloc 为类对象分配内存?
- 将对象分配给数组C++
- 我们可以在cpp中为对象分配函数吗
- 为模板参数类型中的新对象分配内存
- 我无法将对象分配给对象数组
- 对象分配-成员函数的使用无效错误
- 将派生对象分配给函数内的基类指针
- Arduino ESP32如何将BLEUUID对象分配到字符串中
- Rapidjson将密钥值从一个文档对象分配到另一个文档对象
- 奇怪的对象分配行为C