2012-01-18 80 views
2

我一直使用返回引用來嘗試加快我的代碼並避免多個昂貴的複製操作。C++按參考多次返回

我有一個訪問成員函數,看起來像這樣:

std::string const& access_element(int index) const; 

如果我有一個調用access_element()其他成員函數,我需要通過引用返回?

例如,

float const& access_element2(int index) const { 
     return atof(access_element(index)); 
    } 

float access_element2(int index) { 
     return atof(access_element(index)); 
    } 
+7

您通過引用臨時返回值。在這種情況下,您的瓶頸就在於自己,而不是返回副本。 – 2012-01-18 14:27:50

+0

我同意上面的註釋,但是您還需要查看http://en.wikipedia.org/wiki/Copy_elision,因爲編譯器有時可以做出更好的決策。 – rerun 2012-01-18 14:32:41

+0

您不需要爲每個引用返回內置類型作爲優化,它們應該以每個副本高效傳遞。 – sbi 2012-01-18 14:55:53

回答

3

你通過引用返回一個臨時值。 在這種情況下,您的瓶頸在於自己,而不是返回副本。 atof返回一個臨時值。如果你的意圖是通過引用加快返回,你應該返回一個成員對象,或者一個成員對象的成員對象(如向量項),它是由引用返回的。

float const& access_element2(int index) const { 
    return elements[index]; 
} 
+0

那麼你是說,我選擇access_element2的哪個選項並不重要,我會以同樣的方式獲得相同的性能嗎? – user788171 2012-01-18 14:37:00

+0

@ user788171不僅!通過引用返回臨時值是錯誤的,因爲該值超出了「之前」返回的範圍。 – 2012-01-18 14:43:36

+0

你修改後的答案中的代碼是否比float access_element2(int index)快得多?{ return atof(access_element(index)); } – user788171 2012-01-18 14:47:45

3

這裏有一個很好的文章:Want Speed? Pass by Value.

而且你真的需要小心通過引用返回。引用就像指針一樣,你可以獲得不合法可用的懸掛引用。以下是未定義行爲:

int const &foo() { 
    return 1; 
} 

此外,通過原始的類型,如float時,它通常最好只複製它們,因爲傳遞指針意味着您可以複製一個指針代替,這是不太可能快於複製價值本身。這個答案有一個很好的經驗法則來參考參考值與參數值:https://stackoverflow.com/a/1567186/365496

通過const &而不是按值傳遞的另一個原因是如果複製可能需要堆內存分配。這樣的副本可能會失敗,所以最好通過引用來避免錯誤的可能性。