类型组件的指针或可分配对象

Pointer or allocatable for type components

假设您有一个已声明的类型 dat1,它具有默认的成员数。根据 运行 时间,此 dat1 可能会或可能不会扩展为其他类型。这很容易,因为您可以使用 extends 功能。但是,如果您有一个 dat1 的数组,并且该数组的某些元素可能想要也可能不想继承另一种类型——如何最合理地做到这一点。

我有以下例子:

type dat1 

  real :: x(3)
  type(dat2), allocatable :: rnd 
  type(dat1), pointer :: next => dat1
end dat1

现在我用一个链表来做这个。我的问题基本上是将第二种类型 rnd 声明为可分配的,然后在节点请求时分配它是否是正确的方法。 另一种选择是将其声明为指针,即 type(dat2), allocatable :: rnd,现在是否存在任何显着差异,尽管 Fortran 与指针与可分配项(如 explicit/implicit 释放、连续内存等的常见差异)存在差异

请注意,无论如何,每个 dat1 节点将始终附加 0 或 1 个 rnd 类型。
我在 运行 期间考虑检查 rnd 是否已分配或是否关联指针。

派生类型的组件具有相同的 concerns as general pointer/allocatable variables

但是,关于组件还有其他方面值得关注:

  • :在释放派生类型对象时,释放任何已分配的可分配组件;指针组件不会自动解除分配或取消关联。

  • :指针和可分配组件都可以是正在定义的类型(此处为 dat1)或稍后定义,但对于可分配组件,这是一个功能在 Fortran 2008 之前不可用,并且没有得到编译器的广泛支持。

链接问题的答案中未提及的一个差异与此问题相关。在这里你说:

I was considering during runtime that I would check if rnd was allocated or for pointer it would be associated

总是允许问ALLOCATED(x%rnd)(可分配),但不总是允许问ASSOCIATED(x%rnd)(指针)。指针组件可能具有未定义的关联状态,而可分配组件将始终具有已定义的分配状态。1

因此您可能想要设置指针组件的初始关联状态。


1未定义分配状态(Fortran 90)和可分配组件的情况从未在标准中共存。