2012-04-18 90 views
1

在以下示例中,内部函数transfer()对'b'非常适用。类型和类之间的数据存储区别

但它不适用于多态对象a(即不能返回正确大小的字符数组)。

任何人都可以解释这个原因吗?

任何人都可以提供任何想法序列化/打包任意类型的数据(使用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 

回答

5

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

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

相关问题