智能指针内存池

smart pointer memory pool

本文关键字:内存 指针 智能      更新时间:2023-10-16

我正在开发一个大型的、旧的代码库,它使用内存池来提高速度优势。然而,问题是通过内存池分配和释放内存很复杂。我想尝试使用智能指针,但有人建议我,性能的下降将是一个问题。

目前的解决方案似乎是一个智能指针实现,它在引擎盖下继续使用原始内存池。我找不到任何正在使用的智能指针/内存池组合。有人能给我举一个实现的例子吗?在尝试之前,我有什么需要注意的地方吗?

智能指针通常不会为它们所指向的对象分配内存,而是您自己创建对象,并根据生成的原始指针构造所需类型的智能指针。

然而,智能指针在那之后控制对象的生命周期,因此它需要知道一旦对象不再被引用,如何根据您选择的智能指针规则释放对象。

默认操作是使用"删除",但您可以提供自己的"自定义删除程序"。

例如:

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的现代C++设计有一章很好地介绍了智能指针。书中描述的Loki库提供了一些模板,这些模板使用策略类来根据您的特定需求调整智能指针的行为。

请注意,这些是与C++11的std::shared_ptr不同的野兽,并且与它们不兼容。根据您的维护需求,将Loki纳入您的代码库可能不是一个合理的选择。但书中的概念无论如何都值得探究。