gpt4 book ai didi

fortran - Fortran中的函数指针

转载 作者:行者123 更新时间:2023-12-02 15:34:23 25 4
gpt4 key购买 nike

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”循环来节省大量时间。这样的事情有可能吗?

最佳答案

在 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 具有相当好的分支预测器,并且在整个循环期间不改变的分支测试几乎是最好的情况(经验法则:预测的分支接近自由)。哎呀,你的编译器甚至可能能够进行上述类型的优化..

关于fortran - Fortran中的函数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16667424/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com