我正在研究一个使用内存池以获得极大速度优势的大型旧代码库。但问题是,通过内存池分配和释放内存很复杂。我想尝试使用智能指针,但有人告诉我,性能损失将是一个问题。
似乎呈现的解决方案是一个智能指针实现,它继续使用引擎盖下的原始内存池。我无法找到任何正在使用的智能指针/内存池组合。谁能指点我这个例子的实现?在尝试之前我是否应该注意任何问题/注意事项?
答案 0 :(得分:2)
智能指针通常不会为它们指向的对象分配内存 - 而是自己创建对象并从生成的原始指针构造所需类型的智能指针。
然而,智能指针在此之后控制对象的生命周期,因此根据您选择的智能指针的规则,它需要知道如何在不再引用对象时释放对象。
默认操作是使用“删除”,但您可以提供自己的“自定义删除”。
例如:
MyClass* CreateMyObject(/* whatever args you need */) {
// Do whatever it takes to create your object in the pool
return myObject;
}
void DeleteMyObject(MyClass *obj) {
// Do whatever it takes to free object from pool
}
std::shared_ptr<MyClass> ptr(CreateMyObject(....), DeleteMyObject);
我不确定这是否解决了您最初的顾虑 - 您仍然需要处理在池中分配和取消分配对象的复杂性 - 但您确实可以获得智能指针的生命周期管理优势。
Here至少有一个关于使用自定义删除工具的教程。
答案 1 :(得分:1)
Andrei Alexandrescu的Modern C++ Design有一个关于智能指针的好章节。本书中描述的 Loki 库提供了一些模板,这些模板使用策略类来调整智能指针的行为以满足您的特定需求。
请注意,这些是与C ++ 11 std::shared_ptr
不同的野兽,并且与那些不兼容。将Loki合并到您的代码库中可能不是一个合理的选择,具体取决于您的维护需求。但无论如何,本书中的概念值得探讨。