2

我正在为向量类使用运算符重载

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(+)要求模块过程是函数而不是子例程

4

0 回答 0