shared_ptr 具有动态分配内存和 mmap 内存
shared_ptr with dynamic allocated memory and with mmap-ed memory
对于我的项目,我使用 shared_ptr
动态分配 struct
。
在不同的地方,我正在访问相同的 struct
,但是在 mmap-ed 内存上。
是否有一些技巧可以与 shared_ptr
一起使用,以免重复现有代码?例如自定义删除器实际上不删除?
我意识到这仍然有风险,但它会在很短的时间内完成 - 在函数体内,我不想复制整个结构,只是为了 运行 一些简单的函数它。
经过一些研究,对于 MMAP 相关的案例,我做了自定义删除器,什么都不删除。
static void null_deleter(void *){
// null_deleter
}
...
void abc(Blob *p){
mySharedPtr.reset(p, null_deleter);
}
查看 boost 进程间库,它允许在文件的 mmap() 创建的内存中创建对象。它们有一些可重定位指针,能够指向同一内存区域中的对象并将该区域映射到不同位置。不支持的是虚函数 tables 的重定位——他们讨论了这个。但我认为这只适用于 executable 的不同版本或虚拟方法 table 位于共享库中的情况。
您可以使用 std::shared_pointer
的 aliasing constructor:
std::shared_ptr shm; // points at mmap'ed region, with munmap deleter
Foo *p; // somewhere within this region
auto shared_p = std::shared_ptr{p, shm};
这将增加 shm
的引用计数,而 shared_p
是实时的。
对于我的项目,我使用 shared_ptr
动态分配 struct
。
在不同的地方,我正在访问相同的 struct
,但是在 mmap-ed 内存上。
是否有一些技巧可以与 shared_ptr
一起使用,以免重复现有代码?例如自定义删除器实际上不删除?
我意识到这仍然有风险,但它会在很短的时间内完成 - 在函数体内,我不想复制整个结构,只是为了 运行 一些简单的函数它。
经过一些研究,对于 MMAP 相关的案例,我做了自定义删除器,什么都不删除。
static void null_deleter(void *){
// null_deleter
}
...
void abc(Blob *p){
mySharedPtr.reset(p, null_deleter);
}
查看 boost 进程间库,它允许在文件的 mmap() 创建的内存中创建对象。它们有一些可重定位指针,能够指向同一内存区域中的对象并将该区域映射到不同位置。不支持的是虚函数 tables 的重定位——他们讨论了这个。但我认为这只适用于 executable 的不同版本或虚拟方法 table 位于共享库中的情况。
您可以使用 std::shared_pointer
的 aliasing constructor:
std::shared_ptr shm; // points at mmap'ed region, with munmap deleter
Foo *p; // somewhere within this region
auto shared_p = std::shared_ptr{p, shm};
这将增加 shm
的引用计数,而 shared_p
是实时的。