2010-01-21 56 views

回答

15

更喜欢传递原始类型(int,char,float,...)和便宜的复制(点,复杂)值的POD结构。

这比通过引用传递所需的间接方式更高效。

请参阅Boost's Call Traits

模板类call_traits<T>封装了“最好”的方法的一些类型T的参数传递到或从一个函数,并且由被定义为如下表的typedef的集合。 call_traits的目的是确保像“引用引用”这样的问题永远不会发生,并且参数以最有效的方式传递。

4

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

+0

那么如何才能找出他的编译器是否正在优化呢? – Arthur 2012-11-14 15:53:10

+2

通过查看二进制代码 – 2012-11-14 21:32:04

7

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

1

如果类型的大小相同或小于引用/指针的大小,编译器可以通过引用简单地传递值来优化传递基元类型。不能保证编译器会这样做,所以如果你有选择,按值传递原始类型。尽管如此,在模板化的代码中,你通常必须通过引用传递 - 考虑使用const引用的vector的push_back。如果你有一个int整数,你会传递一个基本类型的引用。在这种情况下,您希望编译器通过用参数替换参考值来优化该参数。由于矢量虽然可以存储大量类型,但接受常量引用是最好的选择。

+0

“编译器可以优化...”,只要被调用者不修改referand或在调用任何可能修改它的代码后读取它。但是,当然,如果是这样的话,你希望不会问“哪个更昂贵”的问题,而是“哪个是正确的”:-)尴尬的是你认为编译器可以优化的情况,但实际上它不能,因为你忽略了某些原因它必须是一个参考(别名规则是惊喜的主要原因)。 – 2010-01-21 15:34:46