C++ 二元算术运算符重载

问题描述 投票:0回答:1

我阅读了 cppreference 页面以了解运算符重载 - “二元算术运算符”。我对一段代码中的注释感到困惑,该注释鼓励通过值而不是引用传递以进行编译器优化。我没有经验,所以我可能错过了一些信息,但据我所知,在可能的情况下,鼓励通过引用传递而不是通过值传递。

第一个例子:

class A {
   public:
   A& operator+=(A const& rhs) {
      /*...*/
      return *this;
   }

   friend A operator+(A lhs, A const& rhs) {
      lhs += rhs;
      return lhs;
   }
};

在此代码中,指出在

lhs
中按值传递
operator+
有助于优化链式加法。据我了解,这与 SO 上的this答案形成鲜明对比,该答案指出按值传递会阻止“命名返回值优化”。

第二个例子:

inline A operator+(A const& lhs, X const& rhs) {
  A a = lhs;
  a += rhs;
  return a;
}

第二个示例提供了

A a = lhs;
,根据 this 线程的接受答案进行了解释,如果
operator+
是根据
operator+=
实现的,则第一个示例的优化是正确的。

如果在没有

operator+
的情况下实现
operator+=
,第一个示例的优化是否正确?

如果第二个示例包括“命名返回值优化”,那么哪种实现对于计算效率来说是首选?

还有其他理由选择其中一种而不是另一种吗?

c++ operator-overloading
1个回答
0
投票

这个建议的本质是通常更喜欢按值传递参数,而不是在函数内部进行复制。原因是,仅当实际参数是左值时,按值传递才涉及复制,否则涉及移动。考虑:

Matrix a, b, c;
//...
Matrix d = a + b + c;

这里,

operator+()
将被调用两次,第二次使用临时对象
a+b
。如果
operator+()
的第一个参数是按值传递的,那么第二次添加涉及移动而不是复制。

如果operator+是,第一个例子的优化是否成立 不使用运算符+= 实现? 不,因为在这种情况下,内部没有复制

operator+()

© www.soinside.com 2019 - 2024. All rights reserved.