我理解引用的原则是避免复制大型结构,但是如果你自己编写的函数创建了一个大型结构呢?是否效率较低(或者你是否更有可能耗尽内存)在本地创建变量,然后返回它,而不是将目标对象作为参考传递,并从函数中填充它?
我似乎不能说得那么好,所以一个具体的例子:假设一个函数接受一个字符串,并返回字符串中每一行的向量.该功能是否有实质性优势:
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);