1

我已经阅读了 POINTER 和 ALLOCATABLE 之间的区别以及为什么 Fortran POINTER 需要 TARGET?他们有很好的答案。

似乎最有效的选择是将可分配对象用于大数组,将指针用于链接列表、树等。

现在,如果我有一个高效的可分配变量,目标属性会以某种方式影响它的访问方式或编译器如何使用它优化代码吗?这样做是否可取?

例如,我可以想到我的坐标三元组:

real, dimension(:),allocatable :: x,y,z

在子程序中,我想使用指针以循环方式指向它们。

4

2 回答 2

0

如果您想置换方向(即 (x,y,z) --> (y,z,x)),则不需要指针,因为您可以使用if-else可分配的条件:

    if(dir == 1) then
       allocate(x(1:nx),y(1:ny),z(1:nz))
    elseif(dir == 2) then
       allocate(x(1:ny),y(1:nz),z(1:nx))
    elseif(dir == 3) then
       allocate(x(1:nz),y(1:nx),z(1:ny))
    endif

这应该可以重用代码,因为您始终在 和 中具有平行方向和在 中x的垂直y方向z

于 2013-06-19T23:22:55.243 回答
0

这听起来取决于编译器,我个人不知道编译器开发人员在实践中如何处理这种情况。但是,这可能取决于派生数据类型的大小/复杂性以及子程序中使用的 {intent(in)、intent(out)、intent(inout)} 的类型。比较以下类型:

type ex1
   real :: a ! only one member
end type ex1

type ex2
real, dimension(:), allocatable :: a    ! member 1
type(complicated), allocatable  :: b(:) ! member 2
type(more_complicated) :: c
! :
! :
!                           still has more 200 members!
end type ex2

假设您不想在程序中指向由“ex2 数据类型”构成的对象,我认为删除目标属性可能会提高程序的速度,因为编译器可以在假设的情况下显着优化 ex2 的内部结构在运行时不会对其进行别名处理。当用作子例程的参数时,同样的参数也适用于 intent()。

然而,对于简单的“类型 ex1”,当我不想在我的程序中指向它时,我真的不在乎是否将其保留为带有或不带有目标属性。

于 2014-09-02T19:52:52.513 回答