2

我有一个POD结构,它有很多成员,我想知道C++ 11中用来实现算术运算符的最有效的方法。在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结构(即不只是两个双打)。

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

+6

如果所有的内存都包含在结构本身中,移动构造函数并不会为你做任何事情,但是你仍然有返回值优化,这可能使得隐含的副本不必要。 –

+0

返回值优化是我应该控制的东西(即我需要编写一些代码),还是处于编译器优化的领域? – user1487088

+0

这是一个编译器优化。 –

回答

0

如果一个结构不是拥有任何其他对象或资源,那么移动语义和复制语义是相同的。即使移动构造函数或移动赋值操作符也需要将所有数据成员复制到目标对象。它不需要执行拷贝,也就是拥有的子对象被简单地转移到目标对象,而不是被拷贝。

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