簡體   English   中英

我應該如何在函數中傳遞結構?

[英]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) ,其中r1r2是局部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.

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