是否值得通过引用传递“简单”类型的值?

时间:2009-10-21 08:08:45

标签: c++

请考虑以下事项:

int increment1 (const int & x)
{ return x+1; }

int increment2 (const int x)
{ return x+1; }

我理解传递对类对象的引用,但是我想知道是否值得将引用传递给简单类型?哪个更优化?通过引用传递或通过值传递(在simle类型的情况下?)

4 个答案:

答案 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引用 - 聪明的编译器可以为您选择正确的传递方法,这取决于类型和体系结构的大小。