3

Fortran 中是否可以有函数指针?现在我有一个代码,其中包含如下几行:

subroutine flag(iflag,a,b)

integer n, a, b, ii, iflag

do ii = 1, n
     if (iflag.eq.0) a+b
     else a-b  
end do    

return
end

变量“n”有一个巨大的值,所以要运行这段代码,我觉得我在用“if”命令浪费了很多时间。是否可以编写函数指针之类的东西(我不确定我的意思),以便在代码中执行以下操作:

subroutine flag(iflag,a,b)

*depending on the iflag the subroutine flag is automatically 
precompiled to call either flag_plus or flag_minus*     

return
end

subroutine flag_plus(a,b)

integer n, a, b, ii

do ii = 1, n
     a+b
end do    

return
end

subroutine flag_minus(a,b)

integer n, a, b, ii

do ii = 1, n
     a-b  
end do    

return
end

如果可能的话,我可以通过避免“if”循环来节省大量时间。这样的事情远程可能吗?

4

1 回答 1

8

在 Fortran 77 中,您可以使用有限的函数指针变体,即您可以将过程名称作为参数传递给另一个过程(本质上是函数指针)。但是,您不能拥有一个包含过程地址的变量,然后“调用”该变量。

从 Fortran 2003 开始​​,过程指针变量是该语言的一部分。

话虽如此,我认为您的示例问题可以通过类似的方法更容易解决


if (iflag == 0) then  ! Why is iflag not of type logical?
  do ii = 1, n
    a + b
  end do
else
  do ii = 1, n
    a - b
  end do
end if

确保对其进行分析以查看它是否也有任何影响。现代 CPU 具有非常好的分支预测器,并且在整个循环期间不会改变的分支测试几乎是最好的情况(经验法则:预测的分支接近空闲)。哎呀,您的编译器甚至可以进行上述优化..

于 2013-05-21T10:27:05.220 回答