2

我与我的一位同事就此进行了讨论。并且想知道更多人对哪个“可以”更优化的意见?PS:如果代码只是一个 hello world 程序,-O3 会产生相同的代码,但我们说的是这个代码段位于大型项目中间的场景。

4

2 回答 2

4

背景将是决定性的重要因素。你的分析器可能会告诉你不要出汗。

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

我会选择清晰:

代码意图,而不是方法

所以

std::string tmp("Hello");

或者

std::string tmp = "Hello"; 

会充分表达意图。

于 2012-09-27T21:29:29.707 回答
2

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

std::string f();

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

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

另一方面std::string s = f();,意图更加清晰:无论f()代表什么,其副本都将保留在本地上下文中。对象不会在外部发生变化,并且生命周期正是它定义的范围。

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

于 2012-09-27T21:50:07.373 回答