const string a =“tmp”vs const string& a =“tmp”

时间:2012-09-27 21:26:28

标签: c++ string optimization

我和我的一位同事讨论了这个问题。并且想知道更多人的意见,哪个“可以”更优化? PS:如果代码只是一个hello world程序,-O3会产生相同的代码,但我们讨论的是这个代码段位于大型项目中的情况。

2 个答案:

答案 0 :(得分:4)

背景将决定重要性。你的探查器可能会告诉你不要出汗。

在这种情况下,无论如何都必须构造一个新的std::string,并且' const引用生命周期延长的临时值'实际上只会使编译器工作更多(发出相同/相同的代码)。

我选择明确:

代码意图,而不是方法

所以

std::string tmp("Hello");

或者

std::string tmp = "Hello"; 

会完全表达意图。

答案 1 :(得分:2)

有可能编译器会生成相同的代码,但使用引用会误导随意的读者。考虑不是用文字初始化它而是使用函数的返回:

std::string f();

std::string const & r = f(); // [1]

标记为[1]的行似乎只是为在其他地方管理的对象创建引用(低成本操作)。代码的读者将试图弄清楚引用的字符串是否可以在外部更改,或者即使它可能被销毁而留下悬空引用。他们必须转到f()的文档,发现它实际上是一个临时的,然后回到原始代码,并发现这只是一些程序员在玩智能技巧。

另一方面,std::string s = f();对意图更清楚:无论f()表示什么,它的副本都将保留在本地环境中。该对象不会在外部更改,并且生命周期正是其定义的范围。

请注意,在这两种情况下,行为都是相同的,但在一种情况下,对于随意的读者来说这是显而易见的,而在另一种情况下,读者必须弄明白。我会尽可能在所有情况下使用本地对象,并将生命周期扩展限制为值不会削减它的少数情况(在现实生活中我只需要一次)。