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

时间:2012-04-18 22:46:15

标签: 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

1 个答案:

答案 0 :(得分:5)

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

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