3

Fortran 2003は、次のようなクラスを使用してデータポリモーフィズムをサポートします。

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

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

end subroutine

私の質問は、このサブルーチンを何度も呼び出す必要がある場合、SELECTステートメントが原因でコードの速度が低下するかどうかです。

4

1 に答える 1

3

SELECT TYPE は通常CLASS(*) :: A、オブジェクトの動的な型を指定するトークン、ポインタ、または同様のインデックスを持つポリモーフィック オブジェクト (ここでは) の記述子によって実装されます。選択型の実行は、このトークンの SELECT CASE に似ていますが、ポリモーフィック ガード (CLASS IS) よりも非ポリモーフィック型ガード (TYPE IS) が優先して照合されるという追加の複雑さが伴います。

この構造に関連するオーバーヘッドがあります。そのオーバーヘッドは、コードが何もしなかった場合よりも大きくなります。繰り返しになりますが、何もしないコードはほとんど役に立ちません。したがって、実際の問題は、コードが必要とする必要なレベルの機能 (SELECT TYPE が提供する完全な機能よりも少ない可能性があります) を提供する代替アプローチに対して、SELECT TYPE の使用が実行速度に関して優れているか悪いかです。それに答えるには、そのアプローチを定義して実装し、ユースケースに関連するコンテキストで速度の違いを測定する必要があります。

コメントに示されているように、無制限のポリモーフィック エンティティは、基本的に、任意の型のものを格納するための型安全な方法です。この場合、保存されたモノの値にアクセスできるようにするために、ある段階で SELECT TYPE が必要です。ただし、これは F2003 のポリモーフィズムのサポートの特定のサブセットにすぎません。より典型的な例では、SELECT TYPE はまったく使用されません。オブジェクトの動的な型に関連付けられた動作は、宣言された型のオーバーライドされたバインディングを呼び出すことによってアクセスされます。

于 2013-03-03T22:35:18.057 に答える