簡體   English   中英

C ++通過Const引用並通過Const引用返回

[英]C++ Pass By Const Reference and Return By Const Reference

我試圖了解返回const引用是否有任何好處。 我有一個通常看起來像這樣的階乘函數:

unsigned long factorial(unsigned long n)
{
    return (n == 0) ? 1 : n * factorial(n - 1);
}

我假設當我們通過const引用並且返回一個const引用時會有性能提升......但const -correctness 總是讓我感到困惑。

const unsigned long & factorial(const unsigned long& n)
{
    return (n == 0) ? 1 : n * factorial(n - 1);
}

返回const引用是否有效? 還有,有人可以告訴我:這有益嗎?

這是無效的。 您無法返回對局部變量的引用。

MSVS C ++編譯器甚至提供以下警告:

main.cc : warning C4172: returning address of local variable or temporary

對GCC不太確定,但結果可能是一樣的。

如果值的大小很小,則const引用不比值快。 在這種情況下,值的類型是long ,這是IMO小(例如4到8個字節):因此const引用將不會更快。 實際上它可能更慢,因為要獲取引用的值,編譯器可能需要發出將取消引用引用的代碼(如解除引用指針)。

鑒於引用是像指針一樣(內部)實現的,當值的大小大於指針的大小時,我希望通過傳遞引用獲得比傳遞值更好的性能(假設它甚至合法通過引用:對超出范圍的局部變量的引用不合法)。

const引用在這里是不正確的 - 你將返回對局部變量的引用 - 這里是一個未命名的臨時變量, 1n * factorial(n - 1) 因為引用是函數中的局部變量,所以當引用到達調用者時,該局部變量已經超出范圍,並且無效。

將const引用返回到大型結構化類型,當引用將在函數退出時存活時,您希望避免復制。 通常,這意味着返回對參數或成員變量的引用(在類的情況下)。

唯一通過const引用返回的情況是,您返回的對象將比函數調用*更長(例如返回調用該函數的類的成員),甚至在該上下文中,是否一個應該這樣做是可疑的,因為這將允許兩個不同的調用者訪問相同的內存位置,這使得如果你使用多個線程的事情是一個噩夢修復。

*注意:在您的情況下,您返回的項目是局部變量,因此不會超過函數調用。 因此,您提供的代碼是調用惡意的未定義行為。

可能但我永遠不會那樣做。 為什么?

因為這是使代碼不可讀的好方法。

此外, 編譯器將在沒有此黑客的情況下對其進行優化

此外, 您是否還有其他“瓶頸”需要在您的計划中進行優化?
我的意思是,如果你采用這部分代碼並在匯編中查看它,你會發現傳遞函數值並獲得結果只是一些操作碼。 怎么樣?
那么,32位整數將適合寄存器。 快如“mov eax,......”。
另一方面,您的程序可能有其他可能優化的設計/算法問題......除非它像“hello world”程序一樣簡單。

所以,要做到這一點並不是我要做的事情,歡迎大家挑戰我。

暫無
暫無

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

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