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