是否可以在共享内存中存储多态类?

Que*_*ueg 5 c++ boost shared-memory boost-interprocess

假设我有课BaseDerived : public Base.我使用boost :: interprocess库构建了一个共享内存段.是否可以使用与此类似的代码:

Base* b = new Derived(); 
write(b); //one app writes
Base* b2 = read(b); //second app reads
//b equals b2 (bitwise, not the ptr location)
Run Code Online (Sandbox Code Playgroud)

我在这里看到的问题是,例如,派生的Base类所需的空间是未知的(因此要分配多少shmem?)

:如何通过应用程序之间的指针传递对象?

Cas*_*Cow 12

只需阅读其文档

特别是:

虚拟禁止

虚拟表指针和虚拟表是在构造对象的进程的地址空间,因此,如果我们把与虚拟功能或者虚拟基类的类,放置在共享存储器中的虚拟指针将是其它过程和无效他们会崩溃.

这个问题很难解决,因为每个进程都需要一个不同的虚拟表指针,并且包含该指针的对象在许多进程中共享.即使我们在每个进程中将映射区域映射到同一地址,虚拟表也可以在每个进程中位于不同的地址中.要为进程之间共享的对象启用虚函数,需要进行深度编译器更改,虚拟函数将受到性能损失.这就是为什么Boost.Interprocess没有任何计划支持进程之间共享的映射区域中的虚函数和虚继承.