在以下示例中,内部函数transfer()
适用于'b'。
但它不适用于多态对象a
(即不能返回正确大小的char数组)。
有人能解释一下这个原因吗?
并且任何人都可以提供任意类型的数据序列化/打包(使用MPI)吗?
感谢。
module mm
type::typeA
integer dat(10)
end type
end module
program test
use mm
class(typeA),allocatable::a
type(typeA)::b
allocate(a)
write(*,*),size(transfer(a,['c']))
write(*,*),size(transfer(b,['c']))
end program
答案 0 :(得分:5)
多态对象很可能包含其他隐藏字段,例如指向类vtable和/或RTTI表的指针。此外,由于您已经使多态对象可分配,因此可能会有其他隐藏字段。
由于不能保证vtable地址在不同的MPI等级上相同,因此传输这些指针值不太可能有用。相反,对于多态类型,您必须创建自定义序列化/反序列化例程,在此序列化每个数据字段,将其传输到另一个MPI等级,并在接收端创建一个空对象并用接收到的数据填充它。