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