【问题标题】:Understanding Fortran pointers理解 Fortran 指针
【发布时间】:2015-03-08 16:43:19
【问题描述】:

在 Fortran 中,可以为指针分配内存,或者不能:

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

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

allocate(pt(100,100))

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

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

【问题讨论】:

    标签: fortran fortran90 fortran77 intel-fortran


    【解决方案1】:

    正如 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无关。

    正如Alexander Vogt said 在现代,想要做这种事情的理由越来越少(使用可分配数组代替是一件值得考虑的事情)。

    总而言之,对于“优缺点是什么?”:指针分配和分配做完全不同的事情。选择合适的。

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

      • 我有一个不同的担忧,OP 根本没有提到allocatable。我不确定他是否正确理解了问题中的三行代码的作用。
      • 我不是专业程序员,但在我的工作中,我会做很多编程任务,这些任务通常需要我选择解决问题的最佳方法,而不仅仅是在残酷的方式。不幸的是,我遇到了很多旧代码,必须尝试了解发生了什么。所以,是的,我没有完全理解 Fortran 中的指针。我第一次遇到指针是在 C 中。我主要关心的是内存消耗。现在我明白了一点。在我当前的任务中,我们使用派生类型以分配内存的指针形式传递大量数据。谢谢大家:-)
      猜你喜欢
      • 1970-01-01
      • 2020-08-05
      • 2018-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多