内联重载操作符c++

Inlining an overloaded operator c++

本文关键字:c++ 操作符 重载      更新时间:2023-10-16

如果必须频繁使用重载操作符,可以/应该内联该操作符以获得更好的效率(wrt时间或其他)吗?

我想重载'+'操作符,以便在代码中频繁地添加大向量。因此问题来了。

理想情况下,您应该分析代码,然后决定内联什么。当你决定内联正则操作符和重载的操作符之间并没有太大的区别。

如果您正在添加大向量,那么函数调用的开销将相对于实际添加两个向量的时间较小。因此,将操作符标记为+ inline不太可能改善总体运行时间。

让编译器决定是否优化

关键字inline是误导性的:编译器实际上总是可以做它需要做的事情,就像旧的 auto(你还记得那些日子吗?)和register

它的现代含义是"在header中定义:不使用就丢弃,出现次数多就合并"。

编译器应该在发布版本中自动为您内联较小的函数。更重要的是定义move构造函数和move赋值。如果您的数组非常大,并且您同时执行多个操作,您还可以使用表达式类来提高执行速度。

template <class left, class right>
struct AddExpr { 
    const left& _left;
    const right& _right;
    AddExpr(const left& Left, const right& Right)
    :_left(Left), _right(Right)
    {assert(left.count() == right.count());}
    int count() const {return _left.count();}
    int operator[](int index) const {return _left[i]+_right[i];}
};
class Array {
    int* data;
    int size;
    int count() const {return size;}
    Array& operator=(AddExpr expr) {
        for(int i=0; i<expr.count(); ++i)
           data[i] = expr[i];
};
AddExpr operator+(const Array& lhs, const Array& rhs) 
{return AddExpr<Array, Array>(lhs, rhs);}
AddExpr operator+(const Array& lhs, const Expr& rhs) 
{return AddExpr<Array, Expr>(lhs, rhs);}
AddExpr operator+(const Expr& lhs, const Array& rhs) 
{return AddExpr<Expr, Array>(lhs, rhs);}
AddExpr operator+(const Expr& lhs, const Expr& rhs) 
{return AddExpr<Expr, Expr>(lhs, rhs);}
int main() {
    Array a, b, c, d;
    Array c = (a+b) + (c+d);  //awesome on lines like this
}

这将删除所有临时对象,并大大提高缓存效率。但是我已经完全忘记这个技巧叫什么了