2012-04-18 2 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, а на конечной стороне вы создаете пустой объект и заполняете его полученными данными.

Смежные вопросы