内联函数是否需要在性能方面通过const 引用传递其参数,例如
foo(const T & a, const T &b)
按值比较
foo(T a, T b)
如果我不更改函数中 a 和 b 的值?C ++ 11更改是否在这里推荐任何具体内容?
内联函数是否需要在性能方面通过const 引用传递其参数,例如
foo(const T & a, const T &b)
按值比较
foo(T a, T b)
如果我不更改函数中 a 和 b 的值?C ++ 11更改是否在这里推荐任何具体内容?
Pass by value can only elide the copy-constructor call if the argument is a temporary.
Passing primitive types by const reference will have no cost when the function is inlined. But passing a complex lvalue by value will impose a potentially expensive copy constructor call. So prefer to pass by const reference (if aliasing is not a problem).
从理论上讲,没有引用的那些可能会被复制到内存中,因为您的内联函数可能正在修改它们(即使它实际上没有)。
在许多情况下,编译器足够聪明,可以挑选出那种东西,但这取决于编译器和优化设置。此外,如果您的函数调用类变量中的任何非 const 成员函数,那么您的编译器必须足够聪明,以检查它们是否也在修改任何内容。
通过使用 const 引用,您基本上可以给它一个相当清晰的指示。
编辑:我只是看一下在 ddd 中使用 GCC 4.6 编译的简单测试程序的机器代码。生成的代码似乎相同,因此似乎确实被优化了。不过,对于其他编译器来说,这仍然是一种很好的做法,如果没有其他任何东西可以清楚地表明代码的意图。也可能存在编译器无法优化的更复杂的情况。
此外,llvm online dissembler demo也显示了相同的位码也在那里生成。如果关闭优化,则没有 const 引用会稍长一些。
* 1964 字节 - 没有 const 引用(函数/参数上没有其他 const)
* 1960 字节 - 只是没有 const 引用,但有其他 const。
* 1856 字节 - 带有 consts 和 const 引用。
根据数据类型,按引用传递比按值传递更快。
然而,对于内联函数,函数体(以及所有引用/传入的值)被添加到它们无论如何都使用的代码行中,因此从技术上讲,没有变量被传递,只有更多的代码行在同一区域。
参考http://www.cprogramming.com/tutorial/lesson13.html
在should-i-take-arguments-to-inline-functions-by-reference-or-value问题下也有一个非常有用的答案