2

私はこれをどこにも見つけることができませんでした。4つの質問があります(厳密に関連しています):

1)このようにfortranで派生型を定義すると

    TYPE :: node
       INTEGER :: int
       REAL :: REALfirst
       REAL :: REALsecond
    END TYPE
    TYPE(node)  :: var
    allocate(var)

上記の割り当ての後、整数用に 4 バイト、2 つの単精度実数用に残りの 8 バイト、合計 12 バイトを占有します。それらはメモリ内に継続的に配置されていますか? また、コンピューターは変数の型に関する情報をどのように保存するのでしょうか?それを保存するには、追加のメモリが必要だと思います。

2) 上記の例では、代わりに

    TYPE(node)  :: var

私は書いたでしょう:

    TYPE(node),POINTER  :: var

32 ビットの実行可能ファイルをコンパイルした場合、ALLOCATE ステートメントは上記の例と同じ量のメモリを割り当てると思います。それが正しいか?

3)ここで、型を宣言するとしましょう

    TYPE :: node
       INTEGER :: int
       TYPE(node), POINTER :: BEFORE
       TYPE(node), POINTER :: AFTER
    END TYPE
    TYPE(node)  :: var
    allocate(var)

ここで (32 ビットでコンパイルされた場合)、整数に 4 バイト、2 つのポインターに残りの 8 バイトを割り当て、合計 12 バイトになります。それは正しいですか?また、コンピューターは変数の型に関する情報をどのように保存するのでしょうか?

4) (3) の例で ALLOCATE(var%BEFORE) と書くと、残りの 12 バイトが派生型 node を持つ変数に割り当てられ、整数型の 4 バイトがポインター var%BEFORE に割り当てられます (参照例 3) が解放されましたね。

ありがとうございます。

4

1 に答える 1

3

1) これは Fortran 標準ではカバーされていません。real4 バイト幅である必要はありintegerません。精度を指定することでそれを保証します。数値の精度は気にせず、バイト数を気にする場合は、次のようにします

 !In Fortran 2008
 use iso_fortran_env

 or

 !In Fortran 95
 integer,parameter :: int32  = selected_int_kind(9)
 integer,parameter :: real32 = selected_real_kind(p=6,r=37)

 and

    TYPE :: node
       INTEGER(int32) :: int
       REAL(real32) :: REALfirst
       REAL(real32) :: REALsecond
    END TYPE

コンパイラは、必要なパディングを挿入できます。これは、4 バイト、8 バイト、またはそれ以上のバイト数の変数を混在させると発生する可能性があります。パディングを抑制するにはSEQUENCE.

2) 割り当てられたメモリは同じになります。コンパイラはまた、簿記のためにいくつかのデータ構造を使用します (それは単なるアドレスかもしれませんが、必ずしもそうである必要はありません)。

3) 私が参照した簿記のデータ構造は、データ型に格納されます。単なる住所かもしれません。

4) ポインター データ構造体は 4 バイトにすることも、それ以上にすることもできます。ただし、より重要な点は、それらが解放されていないことです。ヒープ上の割り当てられた領域を見つける場所を知っている必要があり、そのためにポインターを使用します。このポインターを使用して新しいデータを割り当てるか、既存のデータを指すかは問題ではありません。

派生型のビット サイズは実行時に変更できないことに注意してください。固定されています。もう 1 つの問題は多相変数ですが、この理由から動的に割り当てる必要があります。

于 2013-01-08T09:17:16.990 に答える