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管理實際實例,我認爲您會自動獲得移動支持。