内联函数参数传递

时间:2011-10-02 13:32:17

标签: c++ performance c++11 const-reference

内联函数是否需要性能 -wise通过 const reference 传递其参数,如

foo(const T & a, const T &b)

与按价值比较

foo(T a, T b)

如果我不改变函数中a和b的值? C ++ 11是否会改变推荐的具体内容?

3 个答案:

答案 0 :(得分:11)

如果参数是临时的,则按值传递只能忽略复制构造函数调用。

通过const引用传递基本类型在内联函数时没有任何成本。但是按值传递复数左值将强加一个可能很昂贵的复制构造函数调用。所以更喜欢传递const引用(如果别名不是问题)。

答案 1 :(得分:4)

理论上,没有引用的那些可能会被复制到内存中,因为你的内联函数可能会修改它们(即使它实际上没有)。

在许多情况下,编译器足够聪明,可以选择那种东西,但它取决于编译器和优化设置。此外,如果您的函数调用类变量中的任何非const成员函数,那么您的编译器必须足够聪明,以检查它们是否也在修改任何内容。

通过使用const引用,您基本上可以给它一个相当清楚的指示。

编辑:我只是看一下在ddd中用GCC 4.6编译的简单test program的机器代码。生成的代码看起来相同,所以它似乎已经优化了。对于其他编译器来说,这仍然是一种很好的做法,如果没有其他任何东西可以清楚地表明代码的意图。也有可能存在编译器无法优化的更复杂情况。

同样llvm online dissembler demo也显示了相同的bitcode。如果关闭优化,则在没有const引用的情况下稍长一些 * 1964字节 - 没有const引用(并且函数/参数没有其他的参数)
* 1960字节 - 只是没有const引用而是其他consts * 1856字节 - 带有consts和const引用。

答案 2 :(得分:1)

根据数据类型,按引用传递的速度快于值 但是对于内联函数,函数体(以及因此所有引用/传入的值)都被添加到它们被使用的代码行中,因此从技术上讲,没有传递任何变量,在同一区域中只有更多行代码。 / p>

参考http://www.cprogramming.com/tutorial/lesson13.html

问题should-i-take-arguments-to-inline-functions-by-reference-or-value

下也有一个非常有用的答案
  • 示例可能会误导,删除 -