经常有人指出(例如在这里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/

10-10 21:22