当前位置: 首页 > news >正文

专业网站建设公司推荐石家庄整站优化技术

专业网站建设公司推荐,石家庄整站优化技术,文登区做网站的公司,服务器价格购买价格表目录 一、右值引用与移动语义 1.左值引用与右值引用 2.移动构造和移动赋值 二、引用折叠 三、完美转发 一、右值引用与移动语义 1.左值引用与右值引用 左值:可以取到地址的值,比如一些变量名,指针等。右值:不能取到地址的值…

目录

一、右值引用与移动语义

1.左值引用与右值引用

2.移动构造和移动赋值

二、引用折叠 

三、完美转发


一、右值引用与移动语义

1.左值引用与右值引用

  • 左值:可以取到地址的值,比如一些变量名,指针等。
  • 右值:不能取到地址的值,比如常量、临时对象、匿名对象、表达式结果等。
  • 左值引用:给左值取别名。&表示左值引用。
  • 右值引用:给右值取别名。&&表示右值引用。
  • 一般情况下左值引用(&)不能引用右值,除非使用const修饰该左值引用。
  • 一般情况下右值引用(&&)不能引用左值,除非用move修饰该左值。

 注意:左值引用和右值引用是左值。

示例如下:

int main()
{int a = 8;//其中a为左值。int& pa=a;//pa为左值引用,引用了左值a//8;//8是一个常量为右值int(9);//9是匿名对象为右值5 + 3;//表达式的结果7为右值int&& pb = 8;//pb为右值引用,引用了右值8。int&& pc = int(9);int&& pd = 5 + 3;//const int& pl= 8;//const修饰后的左值引用可引用右值。int&& pr = move(a);//move修饰左值后可被右值引用引用。return 0;
}

2.移动构造和移动赋值

        左值引用可以使得在函数传参过程中减少拷贝,在函数内直接对实参进行修改等等。这些可以大大的提高程序的执行效率。但是对于在被调函数内创建的临时对象不能直接传引用返回到原函数。因为在函数结束后这些临时对象会随着函数栈帧的销毁而销毁,而引用最底层用的是指针。所以必须得返回对象从而进行拷贝转移资源。这样的话会大大的降低程序的执行效率。

        对于以上左值引用的不足之处,右值引用就可以得到一个还好的解决。

        右值引用在引用右值的时候实际上是把该右值的资源的地址保存。而该资源不会被立即释放掉,相当于延长了生命周期,因为右值都是一些临时对象、常量、匿名对象等这些“将亡”值。反正这些资源又没有人使用,那么就不急着释放它可以让右值引用接管它。

        而对于把左值move后进行右值引用,相当于“掠夺”资源,这种情况一般都是该左值不再被需要了,从而把它move让右值引用接管,那么原来的那个左值的状态是未定义的,要避免使用它。

        当然单上面的内容,还体现不出右值引用的高效之处,接下来我们来看右值引用的两个应用的地方,移动构造和移动赋值。

        移动构造和移动赋值的实现是非常简单的就是交换资源,把自己的空资源给别人把别人的拿过来。如下一个string类的移动构造和移动赋值的简单实现:

string(string&& s)
{swap(s);
}
string& operator=(string&& s)
{swap(s);return *this;
}

移动构造和移动赋值相比拷贝构造和拷贝赋值效率是非常之高的,值得我们学习并使用。

二、引用折叠 

        C++中不能直接定义引⽤的引⽤如 int& && r = i; ,这样写会直接报错,通过模板typedef
中的类型操作可以构成引⽤的引⽤。
        通过模板或typedef中的类型操作可以构成引⽤的引⽤时,这时C++11给出了⼀个引⽤折叠的规则:右值引⽤的右值引⽤折叠成右值引⽤,所有其他组合均折叠成左值引⽤。

如下:

template<class T>
void func1(T&& x);
template<class T>
void func2(T& x);

对于func1当传入左值时是(折叠成)左值引用,当传入右值时是(折叠成)右值引用。

对于func2当传入左值时是(折叠成)左值引用,当传入右值时还是(折叠成)左值引用。

func1这样的函数模板我们通常把它称为“万能引用”。

三、完美转发

        当左值与右值在函数之间一直往下传的时候。我们会无法识别它原本是左值还是右值,因为左值引用和右值引用传入下一层后都被视为左值了。会导致移动构造和移动赋值等操作失效。而完美转发就可以解决这个问题。

完美转发需要用到库提供的一个函数模板forward,源码如下:

template <class _Ty>
_Ty&& forward(remove_reference_t<_Ty>& _Arg) noexcept
{ // forward an lvalue as either an lvalue or an rvaluereturn static_cast<_Ty&&>(_Arg);
}

        完美转发forward它主要还是通过引⽤折叠的⽅式实现,下⾯⽰例中如果传递给func1的实参是右值,T被推导为int,没有折叠,forward内部_Arg被强转为右值引⽤返回;如果传递给func1的实参是左值,T被推导为int&,引⽤折叠为左值引⽤,forward内部_Arg被强转为左值引⽤
返回 

void func1(T&& x)
{//......func2(std::forward<T>(x));
}
void func2(T&& x)
{//......
}
http://www.hkea.cn/news/292265/

相关文章:

  • 工程招聘网站如何免费制作自己的网站
  • 网站建设调研问卷搜易网托管模式的特点
  • 在哪个网站可以做java面试题宁德市蕉城区疫情
  • 2021年重大新闻事件seo快速工具
  • 拼多多网店南宁优化推广服务
  • 洛阳建筑公司排名长沙官网seo服务
  • 网站关键词优化公司哪家好企业网站seo点击软件
  • 做网站有必要?优化师培训
  • 网站怎么发布信息百度推广优化技巧
  • 西安软件培训百度百科优化排名
  • 网站上文章加入音乐是怎么做的网页代码
  • 深圳公布最新出行政策徐州seo招聘
  • wordpress的漏洞seo优化知识
  • 网站建设高端seo和sem分别是什么
  • 成交功能网站怎么推广自己的产品
  • 北京宣传片网站seo综合查询
  • 滨海网站建设公司百度指数的使用
  • 湛江网站建设外包seo到底是什么
  • 做收集信息的网站河源市企业网站seo价格
  • 有赞短链接生成汕头seo推广
  • 团队做网站分工搜索引擎案例分析结论
  • 企业网站的建设过程做整站优化
  • 最简单的cms网站怎么做惠州抖音seo
  • 做网站销售怎么开发客户自己做一个网站
  • wordpress发布文章空白整站优化 mail
  • vs怎么做网站的首页seo知识培训
  • 网站建设的一般步骤包括知乎关键词排名工具
  • 网页设计怎样做一个网页seo软件哪个好
  • 销售性网站建设需求seo案例
  • 企业怎样选择域名做网站电脑突然多了windows优化大师