如何创建非 POD 类型的连续内存池?

How to create pool of contiguous memory of non-POD type?

本文关键字:类型 连续 内存 POD 何创建 创建      更新时间:2023-10-16

>我有一个场景,其中我有多个操作

,如下所示:
struct Op {
virtual void Run() = 0;
};
struct FooOp : public Op {
const std::vector<char> v;
const std::string s;
FooOp(const std::vector<char> &v, const std::string &s) : v(v), s(s) {}
void Run() { std::cout << "FooOp::Run" << 'n'; }
};
// (...)

我的应用程序可以多次工作。在每次传递中,我都想创建许多这样的操作,在传递结束时,我可以同时丢弃它们。因此,我想为这些操作预先分配一些内存块,并从该内存中分配新操作。我想出了以下代码:

class FooPool {
public:
FooPool(int size) {
foo_pool = new char[size * sizeof(FooOp)]; // what about FooOp alignment?
cur = 0;
}
~FooPool() { delete foo_pool; }
FooOp *New(const std::vector<char> &v, const std::string &s) {
return new (reinterpret_cast<FooOp*>(foo_pool) + cur) FooOp(v,s);
}
void Release() {
for (int i = 0; i < cur; ++i) {
(reinterpret_cast<FooOp*>(foo_pool)+i)->~FooOp();
}
cur = 0;
}
private:
char *foo_pool;
int cur;
};

这似乎有效,但我很确定我需要以某种方式照顾FooOp的对齐方式。此外,我什至不确定这种方法是否可行,因为这些操作不是 POD。

  • 我的方法有缺陷吗?(最有可能(
  • 有什么
  • 更好的方法呢?
  • 有没有办法使用unique_ptrs 回收现有内存?

谢谢!

我认为这段代码将具有类似的性能特征,而无需您弄乱放置新的和对齐的存储:

class FooPool {
public:
FooPool(int size) {
pool.reserve(size);
}
FooOp* New(const std::vector<char>& v, const std::string& s) {
pool.emplace_back(v, s); // in c++17: return pool.emplace_back etc. etc.
return &pool.back();
}
void Release() {
pool.clear();
}
private:
std::vector<FooOp> pool;
}

这里的关键思想是,你的FooPool本质上是在做std::vector做的事情。