2017-01-20 91 views
0

我正在使用C++。 我想乘矩陣使用運算符無法複製的矩陣乘法*

class mat 
{ 
mat operator *(const mat& mA,const mat& mB) 
} 

如果RVO爲ON,然後我會直接使用*運算符計算**的價值。但是,如果RVO關閉,我將不得不復制對象。 RVO不是標準的一部分。我想確保每一個考慮者都會在沒有應付的情況下繁殖。什麼是避免複製對象的最佳方法。我的問題包括C++ 11,14。

有沒有辦法重寫*運算符**來乘法矩陣而不應用結果,即使RVO關閉。

+1

爲什麼你會永遠禁用RVO和複製省略?你能詳細說明你的實際問題嗎? –

+0

我想確保每個編譯器的行爲都是一樣的。 –

+1

這是不太可能出現的,每個編譯器都會編譯它的設計者決定的方式,你可能需要的唯一東西是語義被保留。 –

回答

1

如果使用C++11那麼爲什麼不使用Move constructorsMove assignment operator。每當通過過載的分辨率,當一個對象從右值(x值或prvalue)相同類型的初始化,包括值

  • 函數返回其通常發生選擇

    此舉構造函數被調用。

所以,這些中的一個可以用來假定mat::x是靜態分配int

friend mat&& mat::operator*(const mat &a, const mat &b) 
{ 
    mat *c = new mat(); 
    c->x = a.x * b.x; 
    return std::move(*c); 
} 

friend mat mat::operator*(const mat &a, const mat &b) 
{ 
    mat c; 
    c.x = a.x * b.x; 
    return c; 
} 

另外提供相應爲class matmove constructormove assignment operator

我想確保每個編譯器都能在沒有應付的情況下進行繁殖。什麼是避免複製對象的最佳方法。

而不是operator*使用:

void mat::Multiplication(const mat &a, const mat &b, mat &result); 
{ 
    result.x = a.x * b.x; 
} 
+0

我是這樣要求的,但在移動參考的情況下,你返回右值參考墊,我對rvalie的參考還不是很好。你介意擴展代碼嗎? –

+0

實際上,這個問題的主要原因是在這種情況下使用rvlue參考。 1從我身上 –

0

等待C++ 17,其中RVO被指定在某些情況下發生。除此之外,請查看您的編譯器所保證的具體細節,這可能超出標準要求。