编辑:正如许多人所指出的那样,传递引用通常不适合作为基本类型的优化。这很好知道,谢谢大家!即便如此,我的问题更多的是为什么文字价值似乎无法通过引用传递,这已被公认的答案所解决。干杯!
(原谅我的天真:我对C ++很陌生。)
为了避免在调用函数(比如“fillRect”)时按值复制效率低下,我想通过引用传递参数。
如果我将参数作为声明的局部变量提供,它可以正常工作。但是如果我提供任何“文字”整数,我会得到一个编译错误(没有匹配的函数)。
void fillRect( int &x, int &y, int &width, int &height )
{
// do something
}
int x=10, y=20, w=100, h=80;
fillRect(x, y, w, h); // this compiles and works!
fillRect(x, y, 100, 80); // but this doesn't compile ... why?
是什么给出了?
答案 0 :(得分:21)
您不能将文字绑定到非const的左值引用(因为修改文字的值不是一个有意义的操作)。但是,您可以将文字绑定到对const的引用。
如果你将fillRect
声明为:
void fillRect(int const& x, int const& y, int const& width, int const& height)
在这种情况下,您正在传递int
s。 int
复制起来非常便宜,通过引用传递它们可能会使你的程序性能变差。
函数fillRect
可能非常昂贵,以至于传递参数的成本在任何情况下都完全无关紧要。或者也许它会被内联,并且传递参数不会有任何代价。这些微观优化通常都不是优化,应始终以分析结果为指导(如果完成的话)。
答案 1 :(得分:19)
避免调用函数时按值复制的效率低下
停在那儿。
通过引用传递并不一定意味着“快速”。这对于基本类型来说是双重。实际上,通过引用访问基本类型将比通过值访问更慢。参考不是魔术。它通常作为指针实现。因此,每次访问该值时,您都可能会执行指针取消引用。
这听起来像某种微优化。不进行分析就不要优化。除非你有充分的理由期望你的应用程序的性能取决于价值与参考参数,所以只要做有意义的事情。
如果您打算修改它们,则只应通过引用传递基本类型。
答案 2 :(得分:9)
对于这样小的值,通过引用传递实际上更慢。要通过引用传递,它是在引擎盖下传递一个指针(无论如何都是一个int大小的值)。然后,有一个隐藏的额外指针间接不是免费的。简单地传递值就更直接了。
这样做:
void fillRect( int x, int y, int width, int height )
{
// do something
}
编译器很可能无论如何都会内联你的函数,除非它很大。所以你不能通过在声明函数方面“聪明”来提高性能。
答案 3 :(得分:4)
首先,你应该注意另一个人的建议,更喜欢通过简单类型的值传递。 C(以及扩展的C ++)在设计时考虑了这个用例,这就是它们的优化。
其次,除非您打算修改变量,否则应始终使用const
引用。文字可以绑定到const引用,但不能绑定到非const引用。
答案 4 :(得分:-2)
您似乎已经熟悉值复制的问题,因此您已消除 值 。现在你很困惑,传递原始值失败了?
现在我迷路了。