[英]Fortran: procedure pointer to method
我處於以下情況:我有一個 object 必須用一些輸入參數x
初始化(不着急)。 然后它有一個必須運行(快速)的方法do_work
。 現在,根據x
, do_work
可以是 function f1
或f2
。 當然,當do_work
時,我可以在其中進行選擇,但是,由於我事先知道選擇,我正在考慮使用過程指針。
我制作了以下 MWE
module delegate_m
implicit none
private
type delegate
private
integer :: x
procedure(delegate_function), private, pointer :: fptr
contains
private
procedure:: f2
procedure :: f1
procedure, public :: do_work
end type delegate
interface delegate
module procedure :: init_delegate
end interface delegate
abstract interface
integer function delegate_function(self,y)
import :: delegate
class(delegate) :: self
integer :: y
end function delegate_function
end interface
public :: delegate
contains
type(delegate) function init_delegate(x)
implicit none
integer, intent(in) :: x
init_delegate%x = x
if (modulo(x, 2) == 0) then
init_delegate%fptr => f1
else
init_delegate%fptr => f2
end if
end function init_delegate
integer function f1(self,y)
implicit none
class(delegate) :: self
integer :: y
f1 = y * self%x
end function f1
integer function f2(self,y)
implicit none
class(delegate) :: self
integer :: y
f2 = (y ** 2) * self%x
end function f2
integer function do_work(self, x, y)
implicit none
class(delegate) :: self
integer:: x, y
do_work = self%fptr(x) - y
end function do_work
end module delegate_m
program test
use delegate_m
implicit none
type(delegate) :: d1, d2
d1 = delegate(45)
d2 = delegate(44)
write (*,*) d1%do_work(2, 3)
write (*,*) d2%do_work(2, 3)
end program test
它似乎有效,但我對(現代)Fortran 相當陌生,我想知道我是否做錯/危險,因為我正在使用指針。 如果該abstract interface
引入了一些虛擬 function 表查找,我也很好奇(我不明白為什么應該這樣做,但正如我所說,我是新手)
按順序回答您的問題:
abstract interface
基本上只是定義過程指針的“類型簽名”。 它不會增加任何開銷。fptr
時,您都會(除非它以某種方式優化)有單指針查找的開銷。 這可能會或可能不會干擾一些可能的編譯器優化。 真的很難說這是否真的會有意義地減慢任何東西,而不僅僅是嘗試查看並運行代碼分析器來找出答案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.