请考虑以下事项:
int increment1 (const int & x)
{ return x+1; }
int increment2 (const int x)
{ return x+1; }
我理解传递对类对象的引用,但是我想知道是否值得将引用传递给简单类型?哪个更优化?通过引用传递或通过值传递(在simle类型的情况下?)
答案 0 :(得分:6)
除非您需要“按引用调用”语义,即您想要访问被调用者中的实际变量,否则不应对简单类型使用引用调用。
有关类似的,更一般的讨论,请参阅:"const T &arg" vs. "T arg"
答案 1 :(得分:6)
你也理解premature optimization吗? :)
做最清楚的事。如果该函数将返回该值,则不需要引用。然后,代码的(人类!)读者可能想知道为什么使用引用,没有充分的理由。
UPDATE:如果您希望调用该函数increment()
,那(对我来说)意味着它应该更改传入的值,而不是返回它。这听起来像是一种修改到位的操作。然后使用引用(或指针)并删除返回值可能是有意义的:
void increment(int &value)
{
++value;
}
如果您正在调查什么是最快,我仍然认为您过早地进行了优化。
答案 2 :(得分:0)
它可能不“值得”,但它有时是不同的。考虑这些功能:
int const* addr_ref (int const& i) { return &i; }
int const* addr_byvalue(int const i) { return &i; }
他们显然会回归不同的价值观。所以有时它很有用。
与此同时你应该坚持你的编码惯例。很可能编译器在函数内的优化会丢弃不必要的解引用,并且在调用者代码中它也使用了引用,所以这里的性能几乎不是问题。
答案 3 :(得分:0)
如果函数是模板化的,那么你很难做出选择。当你不知道复制T有多大或多贵时,是否应该通过值或const引用来接受?
在这种情况下,我更喜欢通过const引用传递。如果T的大小小于或等于引用的大小,编译器可以执行优化:它只是通过值传递参数,因为const引用参数承诺不修改参数,所以副作用是一样的。但是,编译器也可以选择不执行此优化,特别是如果在涉及任何const_casts等问题时无法解决问题。
但是出于这个原因,我会支持传递const引用 - 聪明的编译器可以为您选择正确的传递方法,这取决于类型和体系结构的大小。