类型声明的 Fortran 指针属性

Fortran pointer attribute to type declarations

我有以下类型

  type OCTREE_TYPE
     real                          :: box(2,3)
     integer, allocatable          :: icells(:)
     integer                       :: num_point
     integer                       :: depth
     type(OCTREE_TYPE), pointer    :: parent      => NULL()
     type(OCTREE_TYPE), pointer    :: children(:) => NULL()
  end type OCTREE_TYPE

现在,当我声明此数据类型的 变量 时,此声明

之间有什么区别
   type(OCTREE_TYPE),pointer        :: octree_node

还有这个

  type(OCTREE_TYPE)        :: octree_node

除此之外,其中一个是指针,另一个不是。

what is the difference (...) besides that one of them is a pointer and the other is not.

呃……其实,这就是它们之间唯一的区别:一个是指针变量,一个是普通变量。任何其他差异均源于此类事实。如果您已经熟悉指针变量在 Fortran 中的工作方式,那么这个答案就到此为止了。如果你不是,这里有一个简短的描述。

Fortran 中的变量是对包含值的内存地址的命名引用,其类型和特征符合变量声明中的那些值。当您对变量进行操作时,它在存储中的相应值将被提取或更新。

对于普通变量,这个关系是固定的。系统在可能使用它之前为其值(及其所有组件,对于派生类型)分配连续存储,并根据其自己的标准在不再使用时释放该存储。同时,该变量始终引用内存中的同一地址,该地址的位置和大小都是固定的。

另一方面,对于 pointer 个变量,这种关系是动态的。系统不会自动为其基础值分配任何存储空间,唯一 space 指针占用的是一个整数变量,它将存储它当前指向的地址。您有两种使用方式:

1) 你可以指示另一个变量并使你的指针引用内存中与另一个变量引用相同的地址。这称为 指针关联 ,并使您的指针变量作为另一个变量的别名。与其他语言不同,Fortran 中的指针是有类型的,这很棒。您只能将指针关联到在类型、种类和级别上符合它的变量,并且如果它标有 target 属性(或者也是一个指针)。您可以随时更改指针的目标。

2) 你可以通过allocate语句让系统为这个变量分配一个新的内存空间。当您想要控制何时分配或释放存储并使其适合您的程序需要时,这是可取的。此外,您可以推迟在运行时确定变量的详细信息,例如数组的 size/bounds 或参数化类型的 len 参数。请注意,当您选择这种方式时,负责管理其内存。如果您更改了对另一个地址的引用而没有取消分配前一个地址,则可能没有其他对该内存的引用,您或系统也无法释放它,并且会发生内存泄漏。

所以,总结回答一下:有了pointer属性,就可以用这个变量来指向和操作其他的变量,不需要分配内存,acd随便改target OR就可以了手动管理此变量的内存,将其大小、边界和长度推迟到运行时。


说到这里,我必须提醒您灵活性指针给您带来的妥协。处理指针时有很多陷阱和微妙之处,例如内存泄漏、悬挂指针、访问冲突、别名......,这些可能会产生错误或性能损失。如果您唯一需要指针的是动态内存分配部分,并且不打算更改其目标,则应该改用 allocatable 属性。可分配变量和组件也有动态内存,但系统会为您管理释放,尽管您也可以 deallocate 手动。