有需要吗? 性能 - 为... 一致 函数传递其参数 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是否会改变推荐的具体内容?
如果参数是临时的,则按值传递只能忽略复制构造函数调用。
在内联函数时,通过const引用传递基本类型将不会产生任何成本。但是按值传递复数左值将强加一个可能很昂贵的复制构造函数调用。所以更喜欢传递const引用(如果别名不是问题)。
从理论上讲,没有引用的那些可能会被复制到内存中,因为你的内联函数可能会修改它们(即使它实际上没有)。
在许多情况下,编译器足够聪明,可以选择那种东西,但它取决于编译器和优化设置。此外,如果您的函数调用类变量中的任何非const成员函数,那么您的编译器必须足够聪明,以检查它们是否也在修改任何内容。
通过使用const引用,您基本上可以给它一个相当清楚的指示。
编辑:我只是看一下简单的机器代码 测试程序 在ddd中用GCC 4.6编译。生成的代码似乎相同,所以它似乎已经优化了。对于其他编译器来说,这仍然是一种很好的做法,如果没有其他任何东西可以清楚地表明代码的意图。也有可能存在编译器无法优化的更复杂情况。
也是 llvm在线解析器演示 显示在那里也生成了相同的bitcode。如果关闭优化,则在没有const引用的情况下稍长一些。
* 1964字节 - 没有const引用(函数/参数没有其他的参数)
* 1960字节 - 只是没有const引用,但其他consts。
* 1856字节 - 带有consts和const引用。
根据数据类型,按引用传递的速度快于值。
但是对于内联函数,函数体(以及因此所有引用/传入的值)被添加到它们被使用的代码行中,因此从技术上讲,没有传递变量,在同一区域中只有更多行代码。
参考 http://www.cprogramming.com/tutorial/lesson13.html
在这个问题上也有一个非常有用的答案 应-I-取参数到内联函数按引用或 - 值