C引用vs返回值

前端之家收集整理的这篇文章主要介绍了C引用vs返回值前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我理解引用的原则是避免复制大型结构,但是如果你自己编写的函数创建了一个大型结构呢?是否效率较低(或者你是否更有可能耗尽内存)在本地创建变量,然后返回它,而不是将目标对象作为参考传递,并从函数中填充它?

我似乎不能说得那么好,所以一个具体的例子:假设一个函数接受一个字符串,并返回字符串中每一行的向量.该功能是否有实质性优势:

void getLines(std::string in,std::vector<std::string>& out);

过度:

std::vector<std::string> getLines(std::string in);

谢谢你的帮助,

解决方法

第一个例子应该更像是这两个中的一个:
void getLines(std::string in,std::vector<std::string> &out);
void getLines(std::string in,std::vector<std::string> *out);

第二种风格通常更方便,理论上可以大致与第一种风格一样有效:

http://en.wikipedia.org/wiki/Return_value_optimization

是否在实践中看到这取决于编译器,优化级别以及编译器是否可以首先发现机会.

虽然我没有为每个人说话,但我从来没有真正设法让编译器利用RVO,即使是简单的对象也没有做任何花哨的事情.因此,我个人推荐第一种方法,因为您可以保证在每个编译器上获得所需的行为,并且(对我来说似乎相关…)对于每个程序员的代码 – 即,为保持返回而创建的对象值由被调用函数直接填充,没有任何额外的副本.

(与编译器可能无法避免的副本相比,默认构造结果对象的成本(可能被利用的RVO)通常并不重要.)

另一点要注意的是,如果试图避免不必要的副本,通过const引用而不是通过值传递对象通常是一个好主意,例如:

void getLines(const std::string &in,std::vector<std::string> &out);
void getLines(const std::string &in,std::vector<std::string> *out);

猜你在找的C&C++相关文章