了解 Fortran 指针

Understanding Fortran pointers

在 Fortran 中,可以将内存分配给指针,也可以:

real(kind=jp), target :: bt(100,100)
real(kind=jp), pointer :: pt(:,:)

但是你可以给指针分配内存pt:

allocate(pt(100,100))

我的问题是:优缺点是什么?就我所见,将内存分配给指针违背了指针的目的并耗尽了更多内存。当然,我对指针的了解有限,所以如果有人能向我解释这里发生了什么,我将不胜感激。

我正在使用混合了 FORTRAN 77 和 Fortran 90 代码的模型,此外,我正在使用 Intel 编译器编译代码。

在虚拟参数可以是 allocatable (Fortran 2003) 之前,您使用的可分配指针已被广泛使用。通过这种方式,您可以传递一个数组并将其分配到另一个例程中,这对于您事先不知道输入大小的输入例程非常有帮助。

已分配指针的行为与通常的指针非常相似,但不会自动释放。有人说以这种方式使用指针对性能有害,但我自己从未经历过(可能是特定于编译器的)。但是,指针的一个问题是用作伪参数时可能会出现别名。

如今,当我可以使用 allocatable 数组时,我不会使用指针。这有很多好处,其中的关键是自动释放和更好的代码可读性。 (如果你愿意,你也可以使用 LHS 的自动分配,但我通常将其关闭)。

对于 OOP 指针是必不可少的,我经常使用它们,例如链表、树等。如果你有嵌套的派生类型,使用指针来减少取消引用也很优雅。

正如 Vladimir F 在对另一个答案的评论中所说,对于示例代码的作用可能存在一些混淆。虽然不是关于指针的广泛回答(已经部分涵盖),但我会简要评论。

real(kind=jp), target :: bt(100,100)
real(kind=jp), pointer :: pt(:,:)

指针 pt 此时未指向任何内容:它具有未定义的关联状态。您同时声明了两个对象,一个带有 target 属性,一个带有 pointer 属性,这并不意味着什么。

要将pt与目标bt相关联,需要指针赋值:

pt => bt

这样一来,就可以直接通过指针ptbt做一些事情,而不需要任何额外的内存分配(会有一些与指针变量相关的开销,但让我们忽略那个)。

是的,也可以像问题中那样进行指针分配

allocate(pt(100,100))

但是这个新产生的记忆块与bt无关。

因为 在现代,想要做这种事情的理由减少了(使用可分配数组代替是一件值得考虑的好事)。

总而言之,对于"what are the pros and cons?":指针分配和分配做完全不同的事情。选择合适的。