加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C引用vs返回值

发布时间:2020-12-16 03:29:10 所属栏目:百科 来源:网络整理
导读:我理解引用的原则是避免复制大型结构,但是如果你自己编写的函数创建了一个大型结构呢?是否效率较低(或者你是否更有可能耗尽内存)在本地创建变量,然后返回它,而不是将目标对象作为参考传递,并从函数中填充它? 我似乎不能说得那么好,所以一个具体的例子:假
我理解引用的原则是避免复制大型结构,但是如果你自己编写的函数创建了一个大型结构呢?是否效率较低(或者你是否更有可能耗尽内存)在本地创建变量,然后返回它,而不是将目标对象作为参考传递,并从函数中填充它?

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

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);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读