2012-04-18 120 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級別,並在接收端創建一個空對象並用接收的數據填充它。

相關問題