[英]How should I pass a struct in a function?
我很困惑,因為我有一段時間沒有寫過C. 在C ++中,我們將它們作為引用傳遞,以便不復制整個結構。 這也適用於C嗎? 我們應該將它們作為指針傳遞,即使我們不想修改它們,以避免復制?
換句話說,對於檢查兩個結構是否相等的函數,我們最好這樣做
int equal(MyRecord* a, MyRecord* b);
並減少一點可讀性(因為指針)
要么
int equal(MyRecord a, MyRecord b);
會有相同的表現嗎?
通常,傳遞指針更快 - 你將調用equal(&r1, &r2)
,其中r1
和r2
是局部struct
變量。 您可以將形式聲明為const
結構的const
指針(這可以幫助優化編譯器生成更高效的代碼)。 你也可以使用restrict
關鍵字(如果你確定你永遠不會用兩個相同的指針調用你的equal
,例如equal(&r1,&r1)
,即沒有指針別名 )。
但是,某些特定的 ABI和調用約定可能要求對某些特定結構進行特殊處理。 例如, X86-64 ABI為Linux(和Unix SVR4)說,一個struct
與兩個指針或積分值將直通兩個寄存器被返回。 這通常比使用寄存器中的指針修改存儲區更快。 因人而異。
所以要知道什么是更快,你真的應該基准。 但是,按值傳遞足夠大的struct
(例如,至少有4個整數或指針字段)幾乎總是比將指針傳遞給它要慢。
順便說一下,當前台式機和筆記本電腦處理器真正重要的是CPU緩存 。 將常用數據保存在L1或L2緩存中將提高性能。 另請參見本 。
什么是更快的大大取決於結構的大小和它在被調用函數內的使用。
如果您的結構不大於指針,則按值傳遞是最佳選擇(需要復制的數據量較少或相等)。
如果你的結構大於指針,那么它在很大程度上取決於被調用函數內部的訪問類型(並且在ABI細節上也是如此)。 如果對結構進行了許多隨機訪問,則傳遞值可能更快,即使它大於指針,因為指針間接發生在函數內部。
總而言之,如果結構大於指針,則必須進行分析以找出更快的結果。
由於你自己說的原因,傳遞指針更快。
實際上,在這種情況下,我發現C比C ++更具可讀性:通過在調用中傳遞指針,您確認您的參數可能會被調用函數更改。 使用C ++引用時,您不能立即通過僅查看調用來說明,您還必須檢查調用的函數原型以查看它是否使用引用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.