簡體   English   中英

在函數中更改變量與返回

[英]Changing variable in function vs return

int foo() {return 5;}

void bar(int *var) {*var = 5;}

int main()
{
    int lvar;

    lvar = foo();
    bar(&lvar);

    return 0;
}

foo還是bar是更好的選擇? foo的好處是不僅可以用於更改變量值。 但是有時這也更安全,因此不會濫用該功能。 那么性能呢?

在做出此決定時,我不會將性能視為最高優先事項。 無論如何,存在RVO,並且通常應該在進行概要分析之前對其進行優化

也就是說,恕我直言,最大的區別在於調用代碼的外觀:

int f = foo();

int x;
bar(x);

調用返回值的函數時,調用代碼的意圖非常清楚。 即使您不知道foo在做什么,也不必查找它就知道它返回一個int並接受零參數。 另一方面,請查看對bar的調用。 它有什么作用? 它是否在改變的價值a bar的調用可能在較大的代碼塊內,並且要了解該代碼塊,您必須查看bar實際在做什么。 如果將兩者混合使用,可能會變得更糟:

int foobar(int& x);

我不建議您編寫這樣的函數,因為在調用代碼中

int x;
int y = foobar(x);

人們會期望x只是一個不變的參數。 最重要的是,通常迫使調用者為一個簡單的函數調用編寫更多代碼,因為調用者必須在調用該函數之前聲明返回值。

結論:將引用傳遞給返回值不會混淆調用代碼。

另一方面,在某些情況下,傳遞引用是必經之路。 我不時使用的模式如下:

struct MooInput {};
struct MooResult{};
void moo(const MooInput& a, MooResult& b);

現在有了正確的名稱,調用者至少有機會編寫代碼,以便清楚地知道輸入了什么和返回了什么:

MooInput a;
MooOutput b;
void moo(a,b);

PS:如果函數采用參數,對其執行一些操作並返回結果,則注意事項有所不同,例如

int Boo ( int x) { return x++;}

在這種情況下,我通常會同時提供:

void Coo(int& x) { x++; }

因為調用者可能需要兩個版本之一,具體取決於調用函數后是否需要舊值。 如果只有Boo ,並且調用方不需要舊值,則他將被迫進行復制(實際上是分配):

int x;
x = Boo(x);

如果只有Coo並且他需要舊值,那么他還需要復制:

int x;
int y = x;
Coo(x);

暫無
暫無

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

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