如何在C++(Newbie)中通过引用传递"literal"整数

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

在调用函数时避免复制值的低效率

停在那儿.

通过引用传递并不一定意味着"快速".这又加倍所以对于基本类型.实际上,通过引用访问基本类型比通过值访问更慢.参考不是魔术.它通常作为指针实现.因此,每次访问该值时,您都可能会执行指针取消引用.

这听起来像某种微优化.不进行分析就不要优化.除非您有充分的理由期望应用程序的性能取决于值与参考参数,否则只需做有意义的事情.

如果要修改基本类型,则应仅通过引用传递基本类型.

  • @ThisGuyCant即使在具有 64 位指针的系统上,通过引用传递也比通过值传递 int 更容易占用“更多”堆栈空间!这一观察也适用于速度争论。 (4认同)
  • @ IanNi-Lewis我看到你对这个答案的语气有什么看法,但OP实际上发现这对于upvote很有帮助.关于OP的专业知识的争论是有道理的,因为问题标题以"(新手)"结尾.我想在这种情况下,我问的是错误的问题,这些答案是正确的,可以重定向它. (2认同)

Voi*_*tar 9

对于这样小的值,通过引用传递实际上更慢.要通过引用传递,它是在引擎盖下传递一个指针(无论如何都是一个int大小的值).然后,有一个隐藏的额外指针间接不是免费的.简单地传递该值更直接.

做这个:

void fillRect( int x, int y, int width, int height )
{
    // do something
}
Run Code Online (Sandbox Code Playgroud)

编译器很可能无论如何都会内联你的函数,除非它很大.所以你不能通过在声明函数方面"聪明"来提高性能.


Mar*_*som 5

首先,您应该听取其他人的建议,优先选择简单类型的值传递。C(以及扩展的 C++)在设计时就考虑到了这种用例,这就是它们优化的目的。

const其次,除非您打算修改变量,否则您应该始终使用引用。文字可以绑定到 const 引用,但不能绑定到非常量引用。