簡體   English   中英

C ++ 11中的有效算術運算符重載

[英]Efficient arithmetic operator overloading in C++11

我有一個具有許多成員的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結構(即不只是兩個double)。

我想繼續討論沒有指向堆分配內存的指針的結構。

如果一個結構不擁有任何其他對象或資源,則移動語義和復制語義是相同的。 甚至移動構造函數或移動分配運算符也需要將所有數據成員復制到目標對象。 只是不必執行深層復制,即,將擁有的子對象簡單地轉移到目標對象,而無需復制。

如果您的結構確實很大,則可以創建一個holder類型,該類型包含指向堆分配實例的指針(最好使用scoped_ptr)。 然后,您可以支持該持有人類型的移動-實際上,如果您使用scoped_ptr管理實際實例,我認為您將自動獲得移動支持。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM