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

How to pass "literal" integers by reference in C++

本文关键字:literal 整数 引用 C++      更新时间:2023-10-16

为了避免在调用函数时按值复制的低效率(例如,"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?

给了什么?


(原谅我的天真:我对c++很陌生。)

正如许多人指出的那样,引用传递通常不适合作为基本类型的优化。知道这些真是太好了,谢谢大家!即便如此,我的问题实际上更多的是关于为什么文字值似乎不能通过引用传递,这已经在公认的答案中得到了解决。

不能将字面量绑定到非const的左值引用(因为修改字面量的值不是有意义的操作)。但是,可以将字面量绑定到const的引用。

如果你将fillRect声明为:

void fillRect(int const& x, int const& y, int const& width, int const& height)

在这种情况下,您正在通过int s。int是如此便宜的复制,通过引用传递它们可能会使您的程序的性能更差。

函数fillRect可能非常昂贵,以至于传递其参数的成本在任何情况下都是完全无关紧要的。或者它可能是内联的,这样传递参数就不会有任何代价。这些类型的微优化通常根本不是优化,应该始终以分析的结果为指导(如果他们已经完成了)。

在调用函数

时避免按值复制的低效率

到此为止。

通过引用传递并不一定意味着"快"。对于基本类型,这是双重。实际上,通过引用访问基本类型要比通过值访问慢得多。引用不是魔法。它通常被实现为指针。因此,每次访问该值时,都可能执行指针解引用操作。

这听起来像是某种微优化。不要在没有分析的情况下进行优化。除非你有很好的理由期望应用程序的性能取决于值参数和引用参数,否则就做有意义的事情。

如果你想修改基本类型,你应该只通过引用传递它们。

对于这样小的值,按引用传递实际上更慢。通过引用传递,实际上是传递一个指针(无论如何都是一个整型大小的值)。然后,有一个隐藏的额外指针间接不是自由的。直接传递值会更直接。

这样做:

void fillRect( int x, int y, int width, int height )
{
    // do something
}

编译器很可能会内联你的函数,除非它很大。因此,您无法通过"聪明"地声明函数来提高性能。

首先,您应该注意其他人的建议,对于简单类型更倾向于按值传递。C(以及扩展后的c++)在设计时就考虑到了这个用例,这也是它们优化的目的。

第二,除非你打算修改变量,否则你应该总是使用const引用。字面量可以绑定到const引用,但不能绑定到非const引用。