簡體   English   中英

參數傳遞禮儀(C ++)const&vs. value

[英]Parameter Passing Etiquette (C++) const& vs. value

如果函數需要的所有函數都看到它的值,那么你不應該總是通過常量引用傳遞該參數嗎?

我的一位同事表示,對於小類型來說無關緊要,但我不同意。

這樣做有什么好處:

void function(char const& ch){ //<- const ref
    if (ch == 'a'){
        DoSomething(ch);
    }
    return;
}

對此:

void function(char ch){ //<- value
    if (ch == 'a'){
        DoSomething(ch);
    }
    return;
}

它們看起來和我一樣大小:

#include <iostream>
#include <cstdlib>

int main(){

    char ch;
    char& chref = ch;

    std::cout << sizeof(ch) << std::endl; //1
    std::cout << sizeof(chref) << std::endl; //1

    return EXIT_SUCCESS;
}

但我不知道是否總是如此。
我相信我是對的,因為它不會產生任何額外的開銷,而且它是自我記錄的。
但是,我想問社群我的推理和假設是否正確?

你的同事是對的。 對於小類型(char,int),當不修改變量時,通過引用傳遞是沒有意義的。 傳遞值會更好,因為指針的大小(在通過引用傳遞的情況下使用)大約是小類型的大小。

而且,按值傳遞,輸入較少,並且可讀性稍差。

即使sizeof(chref)sizeof(ch)相同,通過引用傳遞字符在大多數系統上也需要更多的字節:雖然標准沒有說明有關引用實現的任何特定內容,但地址(即指針)是經常在幕后傳遞。 通過優化,它可能無關緊要。 編寫模板函數時,不應修改的未知類型的項應始終通過const引用傳遞。

對於小類型,您可以使用const限定符按值傳遞它們,以強調您不會通過函數的簽名觸及參數:

void function(const char ch){ //<- value
    if (ch == 'a'){
        DoSomething(ch);
    }
    return;
}

對於較小的值,創建引用和取消引用它的成本可能大於復制它的成本(如果存在差異)。 當您考慮參考參數幾乎總是作為指針實現時,尤其如此。 如果你只是將你的值聲明為const (我只使用這個值作為輸入而且它不會被修改),那么兩個文檔都同樣好。 我通常只使用const值和所有用戶定義的/ STL類型將所有標准內置類型作為const &

你的sizeof示例存在缺陷,因為chref只是ch的別名。 任何類型T sizeof(T)都會得到相同的結果。

大小是一樣的通過。 結果取決於ABI調用約定,但sizeof(referenceVariable)生成sizeof(value)

如果函數需要的所有函數都看到它的值,那么你不應該總是通過常量引用傳遞該參數嗎?

這就是我的工作 我知道人們不同意我的觀點,並且主張通過值傳遞小內置函數,或者更喜歡省略const 通過引用傳遞可以添加指令和/或消耗更多空間。 我通過這種方式保持一致性 ,因為總是測量任何給定平台的最佳傳遞方式是很難維護的。

沒有超出可讀性的優勢(如果這是您的偏好)。 性能可能會受到輕微影響 ,但在大多數情況下不會考慮。

按值傳遞這些小內置更常見。 如果通過值傳遞,則可以使const限定定義(獨立於聲明)。

我的建議是,絕大多數團隊應該只選擇一種方式來傳遞並堅持下去,除非每一條指令都重要 ,否則表現不應影響到這一點。 const永遠不會傷害。

在我看來,你通過const引用的一般方法是一個很好的做法(但請參閱下面的例子中的一些警告)。 另一方面,您的朋友是正確的,對於內置類型,通過引用傳遞不應導致任何顯着的性能提升,甚至可能導致邊際性能損失。 我來自C背景,所以我傾向於考慮指針的引用(即使有一些細微的差別),並且“char *”將比任何平台上的“char”更大熟悉。

[編輯:刪除了不正確的信息。]

在我看來,底線是當你傳遞更大的用戶定義類型時,被調用的函數只需要讀取值而不修改它們,傳遞“type const&”是一個很好的做法。 正如您所說,它是自我記錄的,並有助於闡明內部API的各個部分的角色。

暫無
暫無

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

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