重载二元运算符时可以避免临时存储吗?

时间:2017-04-06 19:09:11

标签: fortran operator-overloading fortran2008

我正在使用运算符重载来实现矢量类

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

接口运算符(+)要求模块过程为函数而不是子例程

0 个答案:

没有答案