共享内存中我们可以放置数据来供不同的进程去访问、读写。但是不是任何数据都可以放进去呢,答案是否定的。最起码抽象类是不能放进去的,具体理由从书上摘录了一段:在C++中, new运算符可用来在共享内存中初始化C++对象。这一特性对concrete class(具体类)[Bja00]来说是可行的,因为每一个concrete class都包含“提供这一支持所需的全部操作”。concrete class中的所有方法(method)都是非虚方法(nonvirtual);也就是说,它们是被直接调用的,而不是通过函数指针间接调用。很多ACE wrapper facade都是concrete type(具体类型)。
相反,abstract type(抽象类型)包含虚方法,如果将其置于共享内存中,则在编写程序时将很棘手。通常,虚方法是间接调用的,它要借助一个“位于对象内存中”的函数指针表(vtable)。在每一个映射了共享内存的进程中,此共享内存区可能位于不同的虚拟内存区域(location)[BC94、Jor91]。而且,C++编译器/链接器不一定会将vtable放在各个进程的相同地址中。因此,vtable及其指向的函数可能会被映射到各个进程中的不同虚拟地址中,因而必定会在运行时产生问题。
看过这段解释之后会明白很多。