如何在C++中通过引用传递"literal"整数
How to pass "literal" integers by reference in 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?
给了什么?
(原谅我的天真:我对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引用。
- 如何反转整数参数包
- enum是C++中的宏变量还是整数变量
- 努力将整数转换为链表。不知道我在这里做错了什么
- 整数不会重复超过随机数
- 在C++中手动调整数组大小
- 检查输入是否不是整数或数字
- C++使用整数的压缩数组初始化对象
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 将"打开的CV图像"中的"颜色"转换为整数格式
- 通过套接字[TCP]传输数据 如何在C / C ++中打包多个整数并使用send() recv()传输数据
- 如何只允许用户输入正整数
- 如何在c++中从文本文件中逐行读取整数
- C++:如何循环通过向量中的整数元素
- 我可以信任表示整数的浮点或双精度来保持精度吗
- 序列化,没有库的整数,得到奇怪的结果
- 在一定长度后从数组中打印时缺少整数
- std::当在256字节边界上写入整数时,流的奇怪行为
- 内联程序集printf将整数解释为地址
- 是否基于数组B整数打印数组A中的整数
- 如何在C++中通过引用传递"literal"整数