我已阅读difference between POINTER and ALLOCATABLE和Why does a Fortran POINTER require a TARGET?,他们的回答非常好。
似乎最有效的选择是对大型数组使用allocatables,对链接列表,树等等使用指针。
现在,如果我有一个很好的高效可分配变量,target属性是否会以某种方式影响它的访问方式或编译器如何用它优化代码?这样做是否明智?
例如,我可以想到我的坐标三元组:
real, dimension(:),allocatable :: x,y,z
在子程序中,我想用循环方式指向它们。
答案 0 :(得分:0)
如果要置换方向(即(x,y,z) - >(y,z,x)),则不需要指针,因为您可以使用if-else
条件with allocatables:
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
中使用垂直方向。
答案 1 :(得分: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”,当我不想在我的程序中指向它时,我真的不在乎是否将其保留为具有或不具有target属性。