1

在以下示例中,内在函数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
4

1 回答 1

5

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

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

于 2012-04-19T07:32:32.640 回答