Fortran 2003 通过使用类来支持数据多态性,例如:
subroutine excute(A)
class(*) :: A
select type (A)
class is ()
...
type is ()
...
end select
end subroutine
我的问题是:如果我需要大量调用这个子例程,是否会因为 SELECT 语句而减慢代码速度?
Fortran 2003 通过使用类来支持数据多态性,例如:
subroutine excute(A)
class(*) :: A
select type (A)
class is ()
...
type is ()
...
end select
end subroutine
我的问题是:如果我需要大量调用这个子例程,是否会因为 SELECT 语句而减慢代码速度?
SELECT TYPE 通常由多态对象的描述符(CLASS(*) :: A
此处)实现,该描述符具有指定对象动态类型的类似标记或指针或索引。选择类型的执行就像在这个标记上的 SELECT CASE 一样,额外的复杂性是非多态类型保护 (TYPE IS) 优先于多态保护 (CLASS IS) 匹配。
有一些与此构造相关的开销。这种开销比代码什么都不做要多。再说一遍,什么都不做的代码很少有用。所以真正的问题是,对于提供代码所需的必要功能级别(可能低于 SELECT TYPE 提供的全部功能)的替代方法,使用 SELECT TYPE 是更好还是更差执行速度。要回答这个问题,您需要定义和实施该方法,然后在与您的用例相关的上下文中测量速度差异。
正如评论中所指出的,无限多态实体本质上是一种存储任何类型的东西的类型安全方式。在这种情况下,在某个阶段需要 SELECT TYPE 才能访问存储的东西的值。然而,这只是 F2003 对多态性支持的一个相当具体的子集。在更典型的示例中,根本不会使用 SELECT TYPE - 与对象的动态类型相关的行为将通过调用已声明类型的重写绑定来访问。