[英]In C++, is it bad to pass a const bool by reference?
在實際環境中,使用gcc或MS Visual Studio,通過const引用傳遞大小相同或小於int的值類型是不是很糟糕?
即編寫這樣的函數是不好的:
void f(const bool& b);
要么
void f(const char& c);
而不是:
void f(bool b);
要么
void f(char c);
我問的原因是我沒有看到在這些情況下傳遞參考的好處,但也許我錯過了一些東西。
它可能稍微有點壞,或者它可能根本沒有效果(取決於存儲原始值的位置,優化程序有多好以及它如何決定處理代碼)。
該標准沒有強制要求如何實現引用,但實際上編譯器使用指針實現引用。 因此在一般情況下bool&
將使用bool*
,這意味着要訪問bool
,每次都需要額外的指針取消引用。 由於bool
不大於指針,因此不會減少內存占用或減少字節復制以抵消此缺點。
因此,公認的做法是將原語作為值傳遞,因為它更有效。 當然,雖然傳遞這樣的引用並不會真正炸毀任何東西,除非你在循環中訪問值,否則可能甚至不會產生任何可衡量的差異。
除了性能之外,實際上您會遇到不同的行為。
例如,傳遞const
引用可確保函數不能更改引用變量的值,但另一個線程可能會這樣做。 如果通過引用傳遞(即使使用const
),您將看到這些更改,如果您按值傳遞,則不會。
此外,界面的定義限制了您可以對函數內部的變量執行的操作。 考慮這個例子:
int foo(int a) {
a = 5; // valid
}
int bar(const int& a) {
a = 5; // compiler-error
}
如果通過引用傳遞,並且要修改變量的值以供本地使用,則需要進行額外的復制。 如果您按值傳遞,則表示您已經有副本。
一個原因是你想向其他程序員傳達價值是恆定的,在某些情況下它可能更清晰,盡管const bool
就足夠了。
我認為最好by value
傳遞內置類型而不是const reference
因為它實際上更快。 在通過引用傳遞的情況下,您需要創建引用(即獲取地址),然后在使用變量時取消引用。 在大多數情況下,它無論如何都會被編譯器優化
雖然理論上它不是一個好主意,因為引用通常是使用指針實現的。 但是,每個合理的編譯器都應該足夠智能,以識別by-const-reference和基本類型的by-value之間的語義無差異。
如果你有某種模板化的接口必須適用於復雜類型和基本類型,並且你不需要過多的特化開銷(最簡單的例子: std::vector
),通常你沒有選擇。 但是如果你有一個選擇,那么首選傳遞基本類型的值。
這無關緊要,通過價值會使你的代碼更清晰,因此被視為良好的做法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.