我正在开发一个大型的旧代码库,该代码库使用内存池来获得极大的速度优势。但是,问题在于通过内存池分配和释放内存很复杂。我想尝试使用智能指针,但有人建议我,性能损失将是一个问题。
似乎出现的解决方案是一个智能指针实现,它继续使用引擎盖下的原始内存池。我找不到任何正在使用的智能指针/内存池组合。谁能指出我的示例实现?在尝试之前,我应该注意什么问题/注意事项?
我正在开发一个大型的旧代码库,该代码库使用内存池来获得极大的速度优势。但是,问题在于通过内存池分配和释放内存很复杂。我想尝试使用智能指针,但有人建议我,性能损失将是一个问题。
似乎出现的解决方案是一个智能指针实现,它继续使用引擎盖下的原始内存池。我找不到任何正在使用的智能指针/内存池组合。谁能指出我的示例实现?在尝试之前,我应该注意什么问题/注意事项?
智能指针通常不会为它们指向的对象分配内存——而是您自己创建对象并从生成的原始指针构造所需类型的智能指针。
然而,智能指针在此之后控制对象的生命周期,因此它需要知道如何根据您选择的智能指针规则在不再引用该对象时释放该对象。
默认操作是使用“删除”,但您可以提供自己的“自定义删除器”。
例如:
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);
我不确定这是否能解决您最初的担忧——您仍然需要处理在池中分配和取消分配对象的复杂性——但您确实获得了智能指针的生命周期管理优势。
这里至少有一篇关于使用自定义删除器的教程。
Andrei Alexandrescu 的Modern C++ Design有一章很好地介绍了智能指针。书中描述的Loki库提供了模板,这些模板使用策略类来调整智能指针的行为以满足您的特定需求。
请注意,这些是与 C++11 不同的野兽std::shared_ptr
,并且与那些不兼容。将 Loki 合并到您的代码库中可能不是一个合理的选择,具体取决于您的维护需求。但无论如何,书中的概念都值得探索。