如何创建非 POD 类型的连续内存池?
How to create pool of contiguous memory of non-POD type?
>我有一个场景,其中我有多个操作
,如下所示: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_ptr
s 回收现有内存?
谢谢!
我认为这段代码将具有类似的性能特征,而无需您弄乱放置新的和对齐的存储:
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
做的事情。
相关文章:
- ArduinoJson 6.15.2:JsonObject没有命名类型
- 防止主数据类型C++的隐式转换
- 大量序列中核苷酸类型的快速计数
- 如何从C++中的依赖类型中获得它所依赖的类型
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 是否可以初始化不可复制类型的成员变量(或基类)
- 如何获取std::result_of函数的返回类型
- 模板元程序查找相似的连续类型名称
- 可以将两个相同类型的连续数组视为一个数组吗?
- 如何将 n 个连续元素插入到元素类型不可复制的 std::vector 中?
- 如何创建非 POD 类型的连续内存池?
- POD 结构(相同类型的成员):成员是否位于连续的内存位置?
- 在编译时检查特征类型保存的数据在内存中是否连续
- 多态类型的连续存储
- Boost.SSpirit.x3避免将同一类型的两个连续属性塌陷为向量
- 递归类型真的是构建不连续的任意大小数据结构的唯一方法吗
- 在整数数据类型和连续两个字符类型之后.第 2 个字符的数据类型跳过..为什么
- 如何确保每100个给定类型的对象都被分配到连续内存中
- boost::asio-signal_set处理程序仅在捕获第一个信号后执行,并忽略相同类型的连续信号
- 为什么在visual studio中连续的int数据类型变量位于12个字节的偏移