2011-09-22 99 views
4

如果必须频繁使用该运算符,是否可以/应该重载运算符必须内联以获得更好的效率(带时间或其他)?内联重载运算符C++

我想重载'+'运算符以在代码中非常频繁地添加大的向量。因此,这个问题。

回答

7

理想情况下,您可以剖析代码然后决定内联。当你决定内联常规运营商时,实际上没有太大区别。

+0

+1。和@Gaurish Telang:内联适配器方法(为兼容性提供的方法,例如使用相同参数调用其他方法)是合乎逻辑的。 –

+4

+1。在我们的团队工作中,我们的编码标准不鼓励在头文件中内联方法,除非有可证明的性能增益。我们也劝阻数学运算符的运算符重载,除非类本身在逻辑上被认为是一个数字。 – selbie

+1

+1 to @selbie:在大多数情况下,操作符重载只会掩盖代码的逻辑。 –

6

如果您正在添加大向量,则相对于实际添加两个向量的时间而言,函数调用加号的开销将较小。因此,标记运营商+内联不可能改善您的整体运行时间。

+0

......或者至少不够关心。 –

+1

如果经常使用操作员,内嵌它会增加代码大小,并可能由于缓存缺失而降低效率。 – Kleist

4

让编译器决定优化。

关键字inline是一种误导:编译器可以-in实况永远做它需要的,就像与auto(你remenber那些日子?)和register

它的现代意义是“定义在标题:丢弃,如果不使用,合并,如果看到更多次”。

1

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

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 
} 

这将删除所有临时对象,并大大提高缓存效率。但是我完全忘记了这种技术被称为什么。