C ++ 11中高效的算术运算符重载

时间:2012-07-05 03:29:13

标签: c++ c++11 operator-overloading rvalue-reference move-semantics

我有一个包含许多成员的POD结构,我想知道在C ++ 11中实现其算术运算符的最有效方法。

这个结构用于代替数学上下文中的原语;例如:

template<typename Double>
Double calcSomething(const Double& d0, const Double& d1, const Double& d2)
{
    return d0*d1 + 3*d2 - 6;
}

Double只是一个普通的double,或者是一个包含所有相关重载运算符的POD结构:

struct MyDouble
{
    MyDouble(double a, double b) : _a(a), _b(b) {}
    double _a;
    double _b;
};
MyDouble operator+(const MyDouble& d0, const MyDouble& d1) 
{
    return MyDouble(d0._a + d1._a, d0._b + d1._b);
}

使用移动构造函数和右值引用在C ++ 11中实现它是否有一种非常好用,有效的方法?请记住,MyDouble可能是一个大的POD结构(即不只是两个双打)。

我想继续讨论没有指向堆分配内存的指针的结构。

1 个答案:

答案 0 :(得分:0)

如果结构不拥有任何其他对象或资源,那么移动语义和复制语义是相同的。甚至移动构造函数或移动赋值运算符也需要将所有数据成员复制到目标对象。它不必执行副本,即所拥有的子对象只是简单地传输到目标对象,而不是被复制。

如果您的结构非常庞大,您可以创建一个包含指向堆分配实例的指针的holder类型(最好使用scoped_ptr)。然后,您可以支持移动该持有者类型 - 实际上,如果您使用scoped_ptr管理实际实例,我认为您将自动获得移动支持。