在Fortran 2003中使用'class'的效率?

时间:2013-03-01 00:46:33

标签: oop class fortran performance

Fortran 2003通过使用类来支持数据多态性,如:

subroutine excute(A)
  class(*) :: A

  select type (A)
    class is ()
      ...
    type is () 
      ...
  end select

end subroutine

我的问题是:如果我需要调用这个子程序很多次,是否会因为SELECT语句而减慢代码的速度?

1 个答案:

答案 0 :(得分:3)

SELECT TYPE通常由多态对象(此处为CLASS(*) :: A)的描述符实现,该描述符具有指定对象动态类型的标记或指针或索引。然后执行select类型就像这个令牌上的SELECT CASE一样,另外的复杂性是非多态类型防护(TYPE IS)优先于多态防护(CLASS IS)。

这个构造有一些开销。如果代码什么也没做,那么开销就大了。然后,完全没有任何作用的代码很少有用。因此,真正的问题是,对于您的代码需要提供必要级别的功能(可能小于SELECT TYPE提供的完整功能)的某种替代方法,SELECT TYPE的使用是否更好或更差。要回答这个问题,您需要定义并实现该方法,然后在与您的用例相关的上下文中测量速度差异。

如评论中所示,无限多态实体本质上是一种存储任何类型的东西的类型安全方式。在这种情况下,在某个阶段需要SELECT TYPE才能访问存储的东西的值。然而,这只是F2003支持多态性的一个相当特殊的子集。在更典型的示例中,根本不会使用SELECT TYPE - 通过调用声明类型的重写绑定来访问与对象的动态类型相关联的行为。