2014-10-28 149 views
0

我爲我的矩陣結構寫了這段代碼。它計算了一個矩陣矩陣的值增加到e次方,但這是不相關的。我想知道最後幾行發生了什麼。改變這個指針指向的值

是否將p的值複製到指定的位置?它是淺拷貝還是深拷貝? 是這個被改變了嗎?我不這麼認爲,因爲它是常量。

如何實現該副本以使其運行速度更快?

matrix& operator ^=(int e) 
{ 
    matrix& b = *this; 
    matrix p = identity(order()); 
    while (e) { 
     if (e & 1) 
      p *= b; 
     e >>= 1; 
     b *= b; 
    } 
    *this = p; 
    return *this; 
} 
+2

不管它是深層還是淺層複製都取決於你的矩陣類是如何實現的。另外,你的方法沒有標記爲'const',因此'this'不是'const'。 – GWW 2014-10-28 23:01:23

+0

最好使用'auto && p = identity(order());'以避免副本。而'* this = std :: move(p);'稍後。無論如何,爲什麼'* this'的別名? – Deduplicator 2014-10-28 23:03:14

+0

我忘了'auto',但爲什麼有兩個引用? 'matrix'不是一個數組,'identity'返回一個值。別名的存在是爲了提高可讀性。 – titog 2014-10-28 23:08:35

回答

1

下列情況之一將使其更快,如果你加入適當的緩衝竊取到你的類支持:

更換

*this = p; 

通過(首選在C++ 11)

*this = std::move(p); 

swap(p); // if swap is a member 
swap(*this, p); // if it's not 
(對於C++ 03,還是應該在C++ 11工作正常)

然而,因爲你不能到位覆蓋左手邊,最好是在這方面實現 operator^,寫 operator^=

matrix operator^(const matrix& b, int e) 
{ 
    matrix p = identity(b.order()); // move or elision activated automatically 
    while (e) { 
     if (e & 1) 
      p *= b; 
     e >>= 1; 
     b *= b; 
    } 
    return p; // move or NRVO activated automatically 
} 

matrix& operator^=(int e) 
{ 
    *this = (*this)^e; // move activated automatically since RHS is temporary 
    // ((*this)^e).swap(*this); in C++03 
    return *this; 
} 

只注意到要覆蓋*this就位,連續方塊。

0

*this = p;調用您的矩陣的operator=(matrix)方法,如果它有一個,否則它調用一個編譯器生成的operator=()簡單執行p的構件逐個構件副本的字段插入this的字段(使用其相應的operator=()實現)。