参考或返回 - 最佳实践

Lik*_*kon 7 c++ optimization function return-value-optimization

例如,我们有编码功能.使用的最佳做法是什么:

void Crypto::encoding(string &input, string &output)
{
    //encoding string
    output = encoded_string;
}
Run Code Online (Sandbox Code Playgroud)

要么

string Crypto::encoding(string &input)
{
    //encoding string
    return encoded_string;
}
Run Code Online (Sandbox Code Playgroud)

我们应该使用引用还是返回来返回字符串?据我所知,返回一个字符串将需要一些时间来初始化一个将由return指令返回的新字符串.在处理引用的变量时,我不会浪费时间来初始化一些新的变量,我只是结束了这个函数.

我们应该主要使用reference和make函数返回类型void吗?或者,我们应该引用时,我们要返回两个或多个变量,当我们需要返回一个变量,然后使用返回指令只返回的数据?

Eri*_*fer 10

不要优化你没有测量的东西.

通常,返回计算结果更好(更易读)return.如果由于对象太胖而需要很长时间,您仍然可以恢复通过参考参数返回结果,但只有在您证明这将导致性能显着提高(测量它)之后.例如,如果您只编码非常短的字符串并且偶尔只编码一次,那么复制的开销可以忽略不计.

  • *不要优化你没有衡量的东西*,Scott Meyers关于优化的报价将在这里说"你需要确定20%的代码运行90%的运行时间然后尝试优化20代码的百分比." 不记得确切的单词,但是是的意思是相同的. (2认同)
  • 说到测量,在 g++ 4.3 上,这两个函数以相同的速度运行。http://ideone.com/sgl9W (2认同)

Inb*_*ong 7

由于大多数现代编译器都具有RVO功能,因此通常会删除复制内容.即使没有c ++ 11,你也可以获得好处.


Man*_*uel 1

在新标准 C++11 中,由于新的移动语义,您可以使用第二种变体。

不过,最有可能的是,您的编译器仍然只支持较旧的标准。在这种情况下,您的第一个示例不会引起任何复制并且更好。

  • 第二个可能也不会调用复制,请参阅 RVO/NRVO 或 http://stackoverflow.com/q/1394229/79455 (4认同)