通过引用传递比通过值更昂贵

时间:2010-01-21 09:27:34

标签: c++ pass-by-reference pass-by-value

是否存在pass-by-reference比C ++中的pass-by-value更昂贵的情况?如果是这样,那会是什么情况呢?

4 个答案:

答案 0 :(得分:15)

首选传递原始类型(int,char,float,...)和POD结构,这些结构对于按值复制(Point,complex)来说是便宜的。

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

请参阅Boost's Call Traits

  

模板类call_traits<T>封装了“最佳”方法,用于将某种类型T的参数传递给函数或从函数传递,并由一系列typedef组成,如下表所示。 call_traits的目的是确保不会出现诸如“引用引用”之类的问题,并且可以以最有效的方式传递参数。

答案 1 :(得分:7)

您可以阅读本文"Want speed ? Pass by value"关于copy elision和RVO(按值优化返回)。它解释了引用有时会阻止编译器执行它们。

答案 2 :(得分:4)

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

答案 3 :(得分:1)

如果类型大小相同或小于引用/指针的大小,编译器可以优化通过引用传递基本类型以简单地传递值。无法保证编译器会执行此操作,因此如果您有选择,请按值传递基元类型。但是在模板化代码中,你经常需要通过引用传递 - 考虑vector的push_back,它接受一个const引用。如果你有一个int的向量,你将传递一个对原始类型的引用。在那种情况下,您希望编译器通过用值替换引用来优化它。由于向量可能存储大型类型,因此接受const引用是最佳选择。