2016-04-02 90 views
4

我正在將一些函數從Matlab轉換爲C++,並且還有一些與矩陣有關的事情。我的地方在互聯網上發現了這個簡單的功能:C++ - 爲什麼`const類型和變量`作爲函數輸入?

typedef std::vector<std::vector<double> > Matrix; 

Matrix sum(const Matrix& a, const Matrix& b) { 
    size_t nrows = a.size(); 
    size_t ncols = a[0].size(); 
    Matrix c(nrows, std::vector<double>(ncols)); 
    for (int i = 0; i < nrows; ++i) { 
    for (int j = 0; j < ncols; ++j) { 
     c[i][j] = a[i][j] + b[i][j]; 
    } 
    } 
    return c; 
} 

任何人都可以解釋我爲什麼他們用const Matrix& a作爲輸入,而不是Matrix a?他們是否習慣使用它,或者是否有任何使用它的好處,因爲我沒有看到2個版本(const Matrix& aMatrix a作爲輸入)的結果之間的差異。

+2

通過參考,而不是通過價值,你避免對象複製。通過添加const你保證調用者這個函數不會改變任何東西。 – PSIAlt

+3

離線主題:'std :: vector >'是製作矩陣的最簡單方法之一。這是最安全的之一。它也可以是最慢的一個。如果你想要表現,那麼除了靜態數組之外,還要考慮製作2D任何東西。在這裏找到更好的方式來寫好:https://isocpp.org/wiki/faq/operator-overloading#matrix-subscript-op – user4581301

+0

@ user4581301你有任何建議或(似是而非的)參考2D矩陣(除了isocpp)? – scmg

回答

6
  • 引用是爲了避免複製大尺寸的對象。但是,對於小型對象,最好有非引用,因爲引用創建會產生比存儲更多的開銷。例如給定平臺上的<=pointer-size數據類型。
  • constconstconst是爲了確保給定的對象不會被函數改變,這是一個安全檢查程序員編寫給定的函數,爲調用者的合同。它還使得調用者可以傳遞非const和const對象。
  • 有些人可能會認爲const沒有引用沒有意義(因爲原始對象不會被修改)。但是,作爲一個安全網,建議功能實現者具有const參數,這樣錯誤的功能不會改變它的參數。這就是原因,一些功能語言默認爲constness(除非讓它們變爲可變)。
3

你沒有看到的是沒有分析代碼,尋找性能差異是幕後發生的事情。

A Matrix a參數是按值傳遞的。源Matrix將被複制到Matrix a,根據矩陣的大小,這可能需要一段時間。一個3x3的矩陣並不多,但是如果它發生了很多...而且如果不是3x3,你有一個300x300的矩陣,這是很多矢量結構和數據複製。可能會成爲一名性能殺手。幾乎肯定肯定會比傳遞參考版本的函數const Matrix& a花費更長的時間,該函數只複製源Matrix的地址,除非編譯器在執行Matrix本身的副本時看到某些優點。

所以你可以通過Matrix & a來獲得,但是允許函數使用Matrix a的內容,可能會損害調用函數。將聲明更改爲const Matrix & a承諾調用者a將不會在函數內部更改,編譯器通過拒絕編譯來支持此功能。這主要是一件安全的事情。它可以防止引入難以察覺的錯誤的細微錯誤的可能性。

相關問題