智能指针内存池
smart pointer memory pool
我正在开发一个大型的、旧的代码库,它使用内存池来提高速度优势。然而,问题是通过内存池分配和释放内存很复杂。我想尝试使用智能指针,但有人建议我,性能的下降将是一个问题。
目前的解决方案似乎是一个智能指针实现,它在引擎盖下继续使用原始内存池。我找不到任何正在使用的智能指针/内存池组合。有人能给我举一个实现的例子吗?在尝试之前,我有什么需要注意的地方吗?
智能指针通常不会为它们所指向的对象分配内存,而是您自己创建对象,并根据生成的原始指针构造所需类型的智能指针。
然而,智能指针在那之后控制对象的生命周期,因此它需要知道一旦对象不再被引用,如何根据您选择的智能指针规则释放对象。
默认操作是使用"删除",但您可以提供自己的"自定义删除程序"。
例如:
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纳入您的代码库可能不是一个合理的选择。但书中的概念无论如何都值得探究。
相关文章:
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 如何理解将半精度指针转换为无符号长指针和相关的内存对齐
- CUDA:统一内存和指针地址的更改
- 在c++中为我自己的基于指针的数组分配内存的正确方法
- 为什么 vector 的随机访问迭代器给出与指针不同的内存地址?
- 当指向对象的指针作为参数传递给 std::thread 时,内存可见性
- 将统一的内存指针传递给内核会减慢程序的速度
- malloc - 运行时内存指针类型分配
- 共享内存指针分段错误
- 使用动态分配的内存(指针)
- 与对象一起返回时清除了内存指针
- 在UWP C++项目中,程序集分配的内存指针自动更改为0xffffffff
- 使用注入的 dll 使用内存指针编辑值
- 提升共享内存 - 指针的返回向量
- 监视从应用程序写入指定的内存指针从 DLL 接收
- 非分页内存指针
- Qt读取内存指针值
- 简单的程序帮助-发送动态内存指针到函数