aaa*_*dan 15 c++ pass-by-reference
编辑:正如许多人所指出的,传递引用通常不适合作为原始类型的优化.这很好知道,谢谢大家!即便如此,我的问题更多的是为什么文字价值似乎无法通过引用传递,这已被公认的答案所解决.干杯!
(原谅我的天真:我对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?
Run Code Online (Sandbox Code Playgroud)
是什么赋予了?
Man*_*rse 22
您不能将文字绑定到非const的左值引用(因为修改文字的值不是一个有意义的操作).但是,您可以将文字绑定到对const的引用.
因此,如果您声明fillRect为:
void fillRect(int const& x, int const& y, int const& width, int const& height)
Run Code Online (Sandbox Code Playgroud)
在这种情况下,你正在通过ints.int复制它是如此便宜,通过引用传递它们可能会使你的程序性能变差.
该函数fillRect可能非常昂贵,以至于传递其参数的成本在任何情况下都是完全无关紧要的.或者也许它会被内联,并且不会有任何费用来传递参数.这些微观优化通常都不是优化,应始终以分析结果为指导(如果完成的话).
Nic*_*las 20
在调用函数时避免复制值的低效率
停在那儿.
通过引用传递并不一定意味着"快速".这又加倍所以对于基本类型.实际上,通过引用访问基本类型比通过值访问更慢.参考不是魔术.它通常作为指针实现.因此,每次访问该值时,您都可能会执行指针取消引用.
这听起来像某种微优化.不进行分析就不要优化.除非您有充分的理由期望应用程序的性能取决于值与参考参数,否则只需做有意义的事情.
如果要修改基本类型,则应仅通过引用传递基本类型.
对于这样小的值,通过引用传递实际上更慢.要通过引用传递,它是在引擎盖下传递一个指针(无论如何都是一个int大小的值).然后,有一个隐藏的额外指针间接不是免费的.简单地传递该值更直接.
做这个:
void fillRect( int x, int y, int width, int height )
{
// do something
}
Run Code Online (Sandbox Code Playgroud)
编译器很可能无论如何都会内联你的函数,除非它很大.所以你不能通过在声明函数方面"聪明"来提高性能.
首先,您应该听取其他人的建议,优先选择简单类型的值传递。C(以及扩展的 C++)在设计时就考虑到了这种用例,这就是它们优化的目的。
const其次,除非您打算修改变量,否则您应该始终使用引用。文字可以绑定到 const 引用,但不能绑定到非常量引用。