[我編輯了我的問題,作為對我收到的第一批評論的回答。]
眾所周知,const當我們不打算修改函式內輸入的值時,向函式添加引數被認為既是一種良好的編程習慣,也是一種優化編譯的方式;例如,請參閱以下執行緒:
- 'const' 用于函式引數。
- 按值傳遞時“const”不是多余的嗎?
為了更清楚,我的意思是:
int my_function(const int i, const my_struct *p) {
/* where `my_struct` is a large struct previously defined by me */
/* Both `i` (passed by value) and `p` (and/or `*p`?) are meant to remain unchanged during all this function */
[...]
}
但是,我在這個 C 教程中閱讀了以下句子:https : //www.cplusplus.com/doc/tutorial/functions/:
因此,
const參考提供類似于按值傳遞引數的功能,但對于大型別的引數具有更高的效率。這就是為什么它們在 C 中非常流行用于復合型別的引數。但是請注意,對于大多數基本型別,效率沒有明顯差異,在某些情況下,const參考甚至可能效率更低!
那么,在哪些情況下添加const函式的某些引數或引數可能會導致代碼效率降低?任何提示或任何一般經驗法則?
注意:我用 C 編程,而不是用 C 。我知道你只能在 C 中按值傳遞變數。但是,我知道指定引數在函式期間何時保持不變仍然很有用。
我堅持:我的問題不是按參考傳遞還是按值傳遞。我正在用 C 編程,所以我假設引數是按值傳遞的。我的問題是關于何時const不建議使用。
uj5u.com熱心網友回復:
我的問題是關于何時
const不建議使用。
const在函式定義中不使用以提高效率在 C 中并不是真正的問題。
uj5u.com熱心網友回復:
有問題的句子是:
但請注意,對于大多數基本型別,效率沒有明顯差異,在某些情況下,const 參考的效率甚至可能更低!
請注意,這句話是在談論基本型別,例如intor char。如果我們傳遞一個基本型別,它通常會被簡單地放入一個暫存器以供被呼叫的例程使用。如果我們改為通過參考傳遞它(在 C 中通過指標包含),那么它的地址將被放入暫存器中。然后被呼叫的例程必須通過從記憶體中加載來獲取值。因此,在這種情況下,通過參考傳遞會增加開銷。如果多次使用該值,甚至可能需要多次加載該值,因為各種事情可能會修改它。(它const指向被呼叫例程的事實并不意味著它const指向呼叫者。該物件可以由其他指標指向,這些指標不包括const被呼叫例程呼叫的其他例程和/或由其他例程更改。)
uj5u.com熱心網友回復:
在我看來,const關鍵字最重要的用途是為了代碼的清晰度。它告訴源代碼的讀者這個變數應該保持不變。我強烈建議const盡可能經常用于此目的。
我不會擔心將const關鍵字用于優化微調目的。編譯器在優化代碼方面越來越好,我認為使用const不會在實踐中產生顯著差異。
uj5u.com熱心網友回復:
C 中的句子是關于通過參考傳遞的(特殊的 C 語法void foo(int &x);- 注意&)。在 C 語言中,沒有什么比通過參考傳遞(在 C 意義上)更像的了。
它與 C 中的按參考傳遞沒有任何共同之處。
在 C 中,const引數通常允許編譯器使用更激進的優化方法。
在哪些情況下將 const 添加到函式的某些引數或引數可能會導致代碼效率降低?
*這些情況僅與 C 相關,并且可能會發生編譯器在呼叫函式時必須創建容器的單獨副本。
正如我在評論中所寫,C 當你學習時不要閱讀教程C。這些語言具有相似的語法(這可能欺騙了您)但非常不同。
在您學習語言時,我建議您不要過多考慮微優化。初學者經常關注它們,當他們的主要演算法非常糟糕時試圖節省納秒。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/389568.html
上一篇:通過函式傳遞資料幀資料
