int foo() {return 5;}
void bar(int *var) {*var = 5;}
int main()
{
int lvar;
lvar = foo();
bar(&lvar);
return 0;
}
foo
或bar
是更好的选择吗? foo
的好处是,它不仅可以用于更改变量值。但有时这也更安全,因此功能不会被误用。性能呢?
答案 0 :(得分:0)
在做出这个决定时,我不会将性能视为最高优先级。无论如何都有RVO,一般来说应该not optimize before profiling。
那就是说,imho最大的区别在于调用代码的外观:
int f = foo();
VS
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);