类型和类之间的数据存储差异

mia*_*zhi 1 fortran

在下面的示例中,内部函数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
Run Code Online (Sandbox Code Playgroud)

jan*_*neb 5

多态对象很可能包含其他隐藏字段,例如指向类vtable和/或RTTI表的指针.此外,由于您已经使多态对象可分配,因此可能会有其他隐藏字段.

由于不能保证vtable地址在不同的MPI等级上相同,因此传输这些指针值不太可能有用.相反,对于多态类型,您必须创建自定义序列化/反序列化例程,其中序列化每个数据字段,将其传输到另一个MPI等级,并在接收端创建一个空对象并用接收到的数据填充它.