9

在 C++ 中是否存在按引用传递比按值传递更昂贵的情况?如果是这样,那会是什么情况?

4

4 回答 4

15

更喜欢传递原始类型(int、char、float、...)和按值复制(Point、complex)便宜的 POD 结构。

这将比通过引用传递时所需的间接更有效。

请参阅Boost 的呼叫特性

模板类call_traits<T>封装了将某种类型 T 的参数传入或传出函数的“最佳”方法,并由下表定义的 typedef 集合组成。的目的call_traits是确保“引用引用”之类的问题永远不会发生,并且以尽可能最有效的方式传递参数。

于 2010-01-21T09:31:17.423 回答
7

您可以阅读这篇关于复制省略和 RVO(按值优化返回)的文章“想要速度?按值传递” 。它解释了引用有时会阻止编译器执行它们。

于 2010-01-21T09:39:04.997 回答
5

是的,访问按引用传递的参数可能需要比按值传递的参数更多的间接级别。此外,如果参数的大小小于单个指针的大小,它可能会更慢。当然,这一切都假设编译器没有优化它。

于 2010-01-21T09:29:09.747 回答
1

如果类型的大小与引用/指针的大小相同或更小,编译器可以优化通过引用传递原始类型而不是简单地传递值。无法保证编译器会这样做,因此如果您有选择,请按值传递原始类型。但是,在模板化代码中,您通常必须通过引用传递 - 考虑向量的 push_back ,它采用 const 引用。如果您有一个整数向量,您将传递对原始类型的引用。在这种情况下,您希望编译器通过将引用替换为值来优化它。由于向量可能存储大型类型,因此接受 const 引用是最佳选择。

于 2010-01-21T10:58:45.643 回答