经常有人指出(例如在这里cppreference),通过值定义算术运算符的左侧(lhs)参数有助于优化链式运算。
X operator+( X lhs
, X const & rhs )
为了确保我不会在函数中意外更改lhs,我喜欢声明按值参数const。这会改变有关所需优化的行为吗?
X operator+( X const lhs
, X const & rhs )
最佳答案
当按照+
实现+=
时,通过拷贝获取可以启用特定的习惯用法:
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
时重新使用它,而无需再次执行副本。另一方面,如果您使用上述备选方案之一,则编译器将需要为链中的每个操作制作一个副本。
关于c++ - 算术运算符参数类型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41023661/