【问题标题】:How many bytes does a derived type (in Fortran) occupy? Are the locations contiguous? And a pointer to a derived type?派生类型(在 Fortran 中)占用多少字节?位置是连续的吗?以及指向派生类型的指针?
【发布时间】:2012-12-21 17:36:47
【问题描述】:

我在任何地方都找不到这个,即使它可能是微不足道的,我也想确定我已经很好地理解了。我有 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个字节分配给一个派生类型节点的变量,4个字节的整数类型分配给指针var% BEFORE(参见示例 3)现在已被释放,对吗?

谢谢 A.

【问题讨论】:

  • 我认为这个问题不值得这么多下注。发帖者可能有一些误解,但他的问题是合理的。

标签: pointers types fortran


【解决方案1】:

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

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

【讨论】:

  • 非常感谢。在第 (4) 点有一个错字,我只是对其进行了编辑,然后将 AFTER 替换为 node%BEFORE。我的意思是:如果我们认为第 (3) 点正在做你我所说的事情,那么指针 node%BEFORE 占用 4 个字节(整数寻址一个未定义的内存位置)。如果我现在写 ALLOCATE(var%BEFORE),在堆上分配 12 个字节,这 4 个字节是否被释放?因为如果我写的是 var%BEFORE => var2(var2 是节点类型的另一个变量)而不是 ALLOCATE(var%BEFORE),那么在这种情况下,var2 将有 12 个字节,var%BEFORE 将有 4 个字节,对吗?跨度>
  • (int32/real32 和朋友在 F2008 中被添加到 iso_fortran_env。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-06
  • 2013-05-07
  • 2023-03-26
  • 1970-01-01
  • 2014-06-16
  • 2021-07-02
  • 1970-01-01
相关资源
最近更新 更多