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 个字节,为指针 var%BEFORE 分配的 4 个整数类型字节(参见示例 3) 现在已被释放,对吗?

谢谢。

4

1 回答 1

3

1) 这不在 fortran 标准中。real并且integer不必是 4 个字节宽。通过指定它们的精度来确保。如果您不关心数字精度,而是关心字节数,请这样做

 !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字节,也可以更多。然而,更重要的一点是,它们没有被释放。您必须知道在堆上的哪里可以找到分配的空间,并为此使用指针。无论您是使用此指针分配新数据,还是指向某个现有数据,都没有关系。

Note, that bit size of the derived type cannot change at runtime, it is fixed. Another issue are polymorphic variables, but they must be allocated dynamically for this reason.

于 2013-01-08T09:17:16.990 回答