我正在开发一个大型的旧代码库,它使用内存池来获得巨大的速度优势。然而,问题是通过内存池分配和释放内存很复杂。我想尝试使用智能指针,但有人建议我在性能上的损失将是一个问题。
目前出现的解决方案似乎是一种智能指针实现,它继续使用幕后的原始内存池。我找不到任何正在使用的智能指针/内存池组合。有没有人能给我举一个这样的例子呢?在尝试之前,有什么我应该注意的陷阱/注意事项吗?
发布于 2015-02-21 13:00:44
智能指针通常不会为它们所指向的对象分配内存-而是您自己创建对象,并从生成的原始指针构造所需类型的智能指针。
然而,智能指针在此之后控制对象的生命周期,因此它需要知道如何根据您选择的智能指针的规则,在对象不再被引用时释放该对象。
默认操作是使用'delete',但您也可以提供自己的‘自定义删除程序’。
例如:
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至少有一篇关于自定义参数使用的教程。
发布于 2015-02-21 12:50:38
Andrei Alexandrescu的有一个关于智能指针的很好的章节。书中描述的Loki库提供了模板,这些模板使用策略类来调整智能指针的行为,以满足您的特定需求。
请注意,它们与C++11的std::shared_ptr是不同的,并且与它们不兼容。根据您的维护需求,将Loki合并到您的代码库中可能不是一个合理的选择。但书中的概念在任何情况下都值得探索。
https://stackoverflow.com/questions/28642047
复制相似问题