我无法在任何地方找到这个,即使它可能是微不足道的,我想确定我已经很好理解了。我有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)现在已被释放,对吗?
感谢 甲
答案 0 :(得分: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个字节,但也可以更多。然而,更重要的是,他们没有被释放。您必须知道在堆上找到已分配空间的位置,并使用指针。无论您是使用此指针分配新数据,还是指向现有数据,都无关紧要。
注意,派生类型的位大小在运行时不能更改,它是固定的。另一个问题是多态变量,但出于这个原因必须动态分配它们。