派生类型(在Fortran中)占用多少字节?这些地点是否连续?和指向派生类型的指针?

时间:2013-01-07 22:34:40

标签: pointers types fortran

我无法在任何地方找到这个,即使它可能是微不足道的,我想确定我已经很好理解了。我有4个问题(严格相关):

1)如果我像这样在fortran中定义派生类型

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

在上述分配之后,它占用4个字节用于整数,其他8个用于2个单精度实数,总共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%分配整数类型的4个字节BEFORE(参见示例3)现在已被释放,对吗?

感谢 甲

1 个答案:

答案 0 :(得分:3)

1)这不属于fortran标准。 realinteger不必是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个字节,但也可以更多。然而,更重要的是,他们没有被释放。您必须知道在堆上找到已分配空间的位置,并使用指针。无论您是使用此指针分配新数据,还是指向现有数据,都无关紧要。

注意,派生类型的位大小在运行时不能更改,它是固定的。另一个问题是多态变量,但出于这个原因必须动态分配它们。