После безрезультатного поиска я хочу задать вам вопрос о подпрограммах, содержащих необязательные аргументы, и о том, как они обрабатываются компилятором (время выполнения / время компиляции). Рассмотрим следующий пример программы.
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
Интересно, как компилятор обрабатывает подпрограммы с необязательными аргументами в терминах optimization
. Создает ли компилятор неявно два интерфейса для подпрограммы FCN и выбирает ли затем правильный во время компиляции в основной программе? Кроме того, выполняется ли выражение present (b) / present (c) во время выполнения или во время компиляции? Если я правильно понимаю, компилятор может знать, что первый вызов ABC ведет к пути B, а второй вызов ABC должен вести к пути C. Я задаю этот вопрос, поскольку у меня есть подпрограмма, которая вызывается миллион-миллион раз.
Я хочу избежать того, чтобы во время выполнения было принято решение идти по пути B или пути C. Конечно, можно было бы написать просто две подпрограммы, однако это привело бы к появлению множества дополнительных строк, которые фактически делали бы то же самое.
Заранее всем спасибо за помощь!