gpt4 book ai didi

runtime - Fortran 是否在编译时解析 optional 参数和呈现语句?

转载 作者:行者123 更新时间:2023-12-03 22:24:44 25 4
gpt4 key购买 nike

在没有任何结果的搜索之后,我想问你一个关于包含 optional 参数的子例程以及编译器如何处理它们(运行时/编译时)的问题。考虑以下示例程序。

  module CONTAINS_ABC

contains

subroutine ABC( a, b, c)

implicit none

real, intent(in) :: a
real, intent(in), optional :: b, c

if( present(b) )then ! PATH_B
write(*,*) 'Provide c'
else if( present(c) )then "! PATH_C
write(*,*) 'Provide b'
end if

! Do all the computations with a, b and c

end subroutine ABC

end module CONTAINS_ABC


program CALL_ABC

use CONTAINS_ABC

real :: aa, bb, cc


call ABC( a = aa, b=bb )

call ABC( a = aa, c=cc )


end program CALL_ABC

我想知道编译器如何处理带有 optional 参数的子例程 optimization .编译器是否为子例程 隐式生成两个接口(interface)? FCN 然后在主程序的编译期间选择正确的?此外, 出席(b)/出席(c) 在运行时或编译时评估的语句?
如果我理解正确,编译器可能知道第一次调用 ABC 会导致路径 ,而第二次调用 美国广播公司 必须指向路径 中号 .
我问这个问题,因为我有一个被称为百万次的子程序。

我想避免在运行时决定是否继续 路径 B 路径 C .当然,两个简单地编写两个子例程是可能的,但是,这会产生许多实际上会做同样事情的额外行。

提前感谢大家的帮助!

最佳答案

除了语法和语义之外,Fortran 标准几乎对语言实现的每个方面都保持沉默。例如,人们通常认为 Fortran 通过引用传递参数,但标准只要求程序的行为就像通过引用传递参数一样。如果实现者愿意并且如果他们可以由此产生令人信服的通过引用的模拟,实现者可以自由地使用传递小 Sprite 。

这只是一个冗长的介绍,告诉您特定编译器如何实现语言功能通常是特定于编译器的。还知道实现细节会因同一编译器的版本而异。

我认为您认为在编译时会检查 optional 参数的存在是错误的,即使可以证明它可能是 - 我只是不认为这是当前编译器所做的事情.我希望编译器生成带有 optional 参数的子例程的单个实现。毕竟,它确实取决于程序员,以确保过程不会尝试处理缺少的 optional 参数。

如果你,程序员,知道一个过程会被执行很多次,如果你怀疑不同的实现,一个带有参数 b并且没有 c ,反之亦然,那么由您来确定单独的实现是否比具有 optional 参数的一种实现更快。如果您担心代码重复,您总是可以有第三个过程来实现公共(public)代码,并从两个变体中调用它。

同样,您需要检查编译器生成的汇编器,以了解编译器(版本)对您编写的代码的变化做了什么。

关于runtime - Fortran 是否在编译时解析 optional 参数和呈现语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22944688/

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