在我们的项目中,有很多函数可以通过副本传递字符串:
void f(std::string a);
众所周知,通过引用传递它会更有效,但我的同事说编译器无论如何都会优化它。这对GCC来说是否接近真相?
G ++ 4.8.2,在发布版本中启用了-O2。
谢谢!
答案 0 :(得分:6)
这是一个有点争议的问题。
理论上,是的,编译器在传递值时更有可能应用某些优化。 Chandler Carruth在他的BoostCon 2013主题演讲优化C ++的紧急结构 (video) / (slides)中解释了LLVM的工作原理。
问题是编译器无法摆脱传递值的开销。即使您拥有符合条件的C ++ 11编译器和类似std::string
的可移动类型,也是如此。 Herb Sutter特别在他的CppCon2014演讲现代C ++风格的基础 (slides)中讨论了调用约定的问题。他的结论是像你在C ++ 98-school中学到的那样:使用const&
作为传递非平凡参数的默认值。
反对传值值约定的另一个重要论点是编写高效代码变得非常困难,这提供了强大的异常安全保证:为了提高效率,用户必须将字符串移动到函数中。但在这种情况下,如果函数抛出,字符串将永远消失。
当然,优化的主要指令仍然适用:如有疑问,请进行衡量。在您的真实代码上运行一个分析器,看看哪种方式更适合您。