C++ 如何通过;字面上的;C+中引用的整数+;(新手)

C++ 如何通过;字面上的;C+中引用的整数+;(新手),c++,pass-by-reference,C++,Pass By Reference,编辑:正如许多人指出的那样,传递引用通常不适合作为原始类型的优化。很高兴知道这一点,谢谢大家!即便如此,我的问题实际上更多的是关于为什么文字值似乎不能通过引用传递,这一点已经被公认的答案解决了。干杯 (原谅我的天真:我对C++很陌生) 为了避免调用函数(比如“fillRect”)时按值复制的低效性,我希望通过引用传递参数 如果我将参数作为声明的局部变量提供,它就可以正常工作。但如果我提供任何“文字”整数,我会得到一个编译错误(没有匹配函数) 有什么好处?您似乎已经熟悉了按-值复制的问题,因此您

编辑:正如许多人指出的那样,传递引用通常不适合作为原始类型的优化。很高兴知道这一点,谢谢大家!即便如此,我的问题实际上更多的是关于为什么文字值似乎不能通过引用传递,这一点已经被公认的答案解决了。干杯


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

为了避免调用函数(比如“fillRect”)时按值复制的低效性,我希望通过引用传递参数

如果我将参数作为声明的局部变量提供,它就可以正常工作。但如果我提供任何“文字”整数,我会得到一个编译错误(没有匹配函数)


有什么好处?

您似乎已经熟悉了按-值复制的问题,因此您已经消除了按-值复制的问题。现在你很困惑传递原始值失败了吗


现在我迷路了。

对于这样小的值,通过引用传递实际上要慢一些。要通过引用传递,它在引擎盖下传递一个指针(不管怎样,这是一个int大小的值)。然后,有一个隐藏的非自由的额外间接指针。更直接的方法是简单地传递值

这样做:

void fillRect( int x, int y, int width, int height )
{
    // do something
}
不管怎样,编译器很可能会内联您的函数,除非它很大。因此,如果您在声明函数时表现得“聪明”,就无法提高性能

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?
避免调用函数时按值复制的低效性

停在那里

通过引用传递并不一定意味着“快”。对于基本类型来说,情况更是如此。实际上,通过引用访问基本类型要比通过值访问慢。引用不是魔法。它通常被实现为指针。因此,每次访问该值时,都可能进行指针解引用

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


如果要修改基本类型,则只能通过引用传递它们。

不能将文本绑定到非常量的左值引用(因为修改文本的值不是一个有意义的操作)。但是,可以将文本绑定到对const的引用

因此,如果您将
fillRect
声明为:

void fillRect(int const& x, int const& y, int const& width, int const& height)
在这种情况下,您传递的是
int
s
int
s的复制成本非常低,通过引用传递它们可能会使程序的性能更差


函数
fillRect
可能非常昂贵,因此在任何情况下传递其参数的成本都是完全无关的。或者,它可能是内联的,传递参数不会产生任何成本。这些类型的微观优化通常根本不是优化,并且应该始终以分析结果为指导(如果它们已经完成)。

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


其次,除非要修改变量,否则应始终使用
const
引用。一个文本可以绑定到常量引用,但不能绑定到非常量引用。

C中没有引用,也就是说,在
int
s(在大多数健全的体系结构上)的情况下,C++传递值实际上比传递引用更有效。@Mankarse,这不是100%正确——编译器在实现引用时有一定的自由裁量权,因此,按值传递原语并不一定更有效。更正确的说法是,通过值传递int永远不会降低效率。除非您的编译器有缺陷。:-)-1因为这个答案(a)对OP的专业知识做出了一些贬损性的假设,(b)没有回答这个问题。作为对粗心者的警告,它是有价值的,但可能应该作为评论而不是答案发布。@IanNi Lewis我明白你对这个答案的语气所说的,但OP实际上发现这很有帮助,足以支持投票。关于OP专业知识的猜测是有根据的,因为问题标题以“(新手)”结尾。我想在本例中,我问了一个错误的问题,这些答案正确地重定向了它。请注意,这现在不是完全正确的,就像在C++11和更高版本中一样,您可以将一个文本绑定到一个非常量值引用。