我正在使用运算符重载来实现矢量类
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(=)
将write语句放在函数 vec_add_sv 和子例程 vector_assign 中我发现当我使用
时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
接口运算符(+)要求模块过程为函数而不是子例程