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

在C中返回一个对象

发布时间:2020-12-16 03:18:29 所属栏目:百科 来源:网络整理
导读:我从大多数C和 Java的背景中学习C,我很好奇在C中返回一个对象的最佳方法是什么,而不必复制对象.从我的理解,C 11引入了rvalue引用()来从临时变量(反对复制)移动数据.例: std::string getStr(){ return "Hello";}std::string hello = getStr(); 我想到的另一
我从大多数C和 Java的背景中学习C,我很好奇在C中返回一个对象的最佳方法是什么,而不必复制对象.从我的理解,C 11引入了rvalue引用(&&)来从临时变量(反对复制)移动数据.例:
std::string getStr(){
   return "Hello";
}

std::string &&hello = getStr();

我想到的另一种方式是使用共享指针.

std::tr1::shared_ptr<std::string> getStr(){

    std::tr1::shared_ptr<std::string> hello(new std::string("Hello"));
    return hello;

}

auto hello = getStr();

我在想,也许一个rvalue的参考是更好的,但我想在第一个意见先使用它之前.哪个更好?

还建议如果一个类中的字段不使用构造函数设置,那么这个字段是否会引用引用?例:

class StringHolder{

   public:
     std::string &&str;
};

StringHolder sh;
sh.str = getStr();

非常感谢你们!

解决方法

这个问题可能会被重复.这是一个问题.不过,我也想回答.

在C 11中,当您是像std :: string这样的对象的客户端时,应该通过值传递它,而不用担心效率:

std::string getStr(){
   return "Hello";
}

std::string hello = getStr();

在这个级别你不需要关心rvalue引用.只要知道std :: string可以非常有效地从rvalues(如getStr()的返回)中“复制”.这个“复制”实际上被称为“移动”,并且自动启用,因为您是从一个rvalue(匿名临时)复制.

不要尝试通过还原到引用计数来优化复制.如果您需要共享所有权语义,则仅使用引用计数.这个说法并不总是如此.但是,为了学习基础知识,这是一个很好的经验法则.

当您设计需要通过值传递的类时,您需要开始担心rvalue引用:

class Widget
{
    // pointer to heap data
public:
    // ...
};

要简要介绍rvalue引用和移动语义,N2027是一个体面的教程. N2027太长了,不能粘贴在这里,但足够简单易读. std :: string遵循N2027中规定的基础,使您可以通过免费的内疚感来传递它.您可以按照Widget中相同的设计模式进行操作.

(编辑:李大同)

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

    推荐文章
      热点阅读