经常声明(例如这里cppreference)通过值定义算术运算符的左侧(lhs)参数有助于优化链式运算。
X operator+( X lhs
, X const & rhs )
为了确保我不会在函数中意外更改lhs,我喜欢通过值参数const声明我的。这会改变有关所需优化的行为吗?
X operator+( X const lhs
, X const & rhs )
答案 0 :(得分:2)
按+
执行+=
时,通过复制完成以启用特定习语:
inline X operator+(X lhs, const X& rhs) {
lhs += rhs;
return lhs;
}
另一方面,如果您通过lhs
引用const X&
,则必须自行制作副本,例如
inline X operator+(const X& lhs, const X& rhs) {
X res(lhs);
res += rhs;
return res;
}
或构建一个新对象,如下所示:
inline X operator+(const X& lhs, const X& rhs) {
X res;
... // Modify res to contain the sum of lhs and rhs
return res;
}
如果您使用的是惯用法,编译器可以通过复制一次来优化+
链。编译器注意到你这样做
lhs + rhs1 + rhs2
lhs + rhs1
的结果是一个丢弃的副本,可以在构建(lhs + rhs1) + rhs2
时重复使用,而无需再次执行复制。
另一方面,如果您使用上述替代方案之一,编译器将需要为链中的每个操作制作副本。