我开始实现一个基于 ID 的内存池,其中每个元素都有一个 id,它基本上是向量中的索引。在这种特殊情况下,我在构造对象本身之前就知道索引,所以我认为我在调用构造函数之前设置了 ID。
一些细节
从基于 ID 的池中分配对象如下:
- 从池中分配一个空闲 id
- 根据 id 值获取内存地址
- 在内存地址上构造对象
- 设置对象的ID成员
并且释放是基于该 id
这是代码(感谢jrok):
#include <new>
#include <iostream>
struct X
{
X()
{
// id come from "nothing"
std::cout << "X constructed with id: " << id << std::endl;
}
int id;
};
int main()
{
void* buf = operator new(sizeof(X));
// can I set the ID before the constructor call
((X*)buf)->id = 42;
new (buf) X;
std::cout << ((X*)buf)->id;
}
编辑
我在 boost 沙箱中找到了一个解决方案: sandbox Boost.Tokenmap