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