将通过复制传递std :: string进行优化吗?

时间:2014-10-27 08:24:13

标签: c++ gcc stdstring

在我们的项目中,有很多函数可以通过副本传递字符串:

void f(std::string a);

众所周知,通过引用传递它会更有效,但我的同事说编译器无论如何都会优化它。这对GCC来说是否接近真相?

G ++ 4.8.2,在发布版本中启用了-O2。

谢谢!

1 个答案:

答案 0 :(得分:6)

这是一个有点争议的问题。

理论上,是的,编译器在传递值时更有可能应用某些优化。 Chandler Carruth在他的BoostCon 2013主题演讲优化C ++的紧急结构 (video) / (slides)中解释了LLVM的工作原理。

问题是编译器无法摆脱传递值的开销。即使您拥有符合条件的C ++ 11编译器和类似std::string的可移动类型,也是如此。 Herb Sutter特别在他的CppCon2014演讲现代C ++风格的基础 (slides)中讨论了调用约定的问题。他的结论是像你在C ++ 98-school中学到的那样:使用const&作为传递非平凡参数的默认值。

反对传值值约定的另一个重要论点是编写高效代码变得非常困难,这提供了强大的异常安全保证:为了提高效率,用户必须将字符串移动到函数中。但在这种情况下,如果函数抛出,字符串将永远消失。

当然,优化的主要指令仍然适用:如有疑问,请进行衡量。在您的真实代码上运行一个分析器,看看哪种方式更适合您。