use*_*099 4 fortran runtime compile-time optional fortran90
在没有任何结果的搜索之后,我想问你一个关于包含可选参数的子例程以及编译器如何处理它们(运行时/编译时)的问题。考虑以下示例程序。
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
Run Code Online (Sandbox Code Playgroud)
我想知道编译器如何处理带有可选参数的子程序optimization。编译器是否为子例程FCN隐式生成两个接口,然后在主程序的编译期间选择正确的接口?此外,present(b)/present(c)语句是在运行时还是在编译时评估?如果我理解正确,编译器可能知道对 ABC 的第一次调用会导致路径B,而对ABC的第二次调用必须导致路径C。我问这个问题,因为我有一个被称为百万次的子程序。
我想避免在运行时决定是沿着路径 B还是路径 C。当然,两个人可以简单地编写两个子例程,但是,这会产生很多实际上会做同样事情的额外行。
在此先感谢大家的帮助!
除了语法和语义之外,Fortran 标准几乎没有涉及语言实现的每个方面。例如,人们通常认为 Fortran 通过引用传递参数,但标准只要求程序的行为就像参数通过引用传递一样。如果他们愿意,并且如果他们能够因此产生令人信服的通过引用的模拟,实现者可以自由地使用传递像素。
这只是一个冗长的介绍,告诉您特定编译器如何实现语言功能通常是特定于编译器的。还知道实现细节因同一编译器的版本而异。
我认为您认为在编译时会检查可选参数的存在是错误的,即使可以证明它可能存在 - 我只是不认为这是当前编译器所做的事情. 我希望编译器生成带有可选参数的子例程的单个实现。毕竟,它确实取决于程序员以确保过程不会尝试处理缺少的可选参数。
如果你,程序员,知道一个过程将被执行多次,并且如果你怀疑不同的实现,一个有参数,一个b没有c,反之亦然,那么由你来确定单独的实现是否会比一个实现更快可选参数。如果您担心代码重复,您总是可以使用第三个过程来实现公共代码,并从两个变体中调用它。
同样,您有责任检查编译器生成的汇编程序,以了解您的编译器(版本)对您编写的代码中的变化做了什么。