我正在为向量类使用运算符重载
interface operator(+)
module procedure :: vec_add_sv !< scalar + vector
module procedure :: vec_add_vs !< vector + scalar
module procedure :: vec_add_vv !< vector + vector
end interface operator(+)
:
:
function vec_add_sv( s, v1 ) result( v2 )
type(Vector) :: v2
real(dp), intent(in) :: s
type(Vector), intent(in) :: v1
integer :: i, n
n = v1%size()
call v2%resize(n)
do i=1,n
V2%q(i) = s + V1%q(i)
end do
end function vec_add_sv
:
:
v2 = s + v1
工作得很好。但是,当我实施时:
interface assignment(=)
module procedure vector_assign
end interface assignment(=)
并在函数vec_add_sv和子例程vector_assign中放入 write 语句我注意到当我使用
vec2 = scalar + vector
它调用了vec_add_sv函数和vector_assign子程序。这表明vec_add_sv函数为其返回创建了一个临时向量,然后将该临时向量传递给vector_assign子例程。结果是我循环了我的向量元素两次。
有没有办法在不创建临时存储的情况下实现二元运算符?
我认识到,如果您执行 A = B + ( C * D ) 之类的操作,则需要一个临时的,然后 (C * D) 会创建一个在 B + temp 中使用的临时。但如果我只做一个操作 A = B + C
我想要相当于
interface add
subroutine vec_add( A, B, C )
type(vector), intent(out) :: A
type(vector), intent(in) :: B
type(vector), intent(in) :: C
end subroutine vec_add
end interface add
接口operator(+)要求模块过程是函数而不是子例程