簡體   English   中英

在C ++中,通過引用傳遞const bool是不是很糟糕?

[英]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.

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