美文网首页
关于C++ 0x的右值引用

关于C++ 0x的右值引用

作者: 剑舞春秋 | 来源:发表于2013-01-28 16:15 被阅读148次

右值引用(及其支持的Move语意和完美转发)是C++0x将要加入的最重大语言特性之一.从实践角度讲,它能够完美解决C++中长久以来为人所诟病的临时对象效率问题。从语言本身讲,它健全了C++中的引用类型在左值右值方面的缺陷。从库设计者的角度讲,它给库设计者又带来了一把利器。从库使用者的角度讲,不动一兵一卒便可以获得“免费的”效率提升…

右值引用

在C++03中,临时变量(右值,出现在等号右侧的变量。另一种解释是引用值,没有实际地址的值)和const & type没有实际的差别。而在C++0X标准中添加了一种新的引用类型。叫做右值引用。它的定义类似于typename &&。另外右值引用提供了一种转移语义。

C++代码块:

  

#include <stdio.h> #include <tchar.h> #include <vector> #include <iostream> using namespace  std;        class ObjA { public:     ObjA():data(NULL)     {         cout<<_T("调用构造函数")<<endl;     }            ObjA(const char *_data)     {         int Len=strlen(_data);         data=new char[Len];         memcpy(data,_data,Len);         cout<<data<<endl;         cout<<_T("调用带参构造函数  memcpy")<<endl;     }            ~ObjA()     {         if (data)         {             cout<<data<<endl;             delete[] data;             data=NULL;             cout<<"delete memory data"<<endl;         }                       cout<<_T("调用析构函数.")<<endl;     }            //拷贝赋值     ObjA& operator=(const ObjA &b)     {         int Len=strlen(b.data);         data=new char[Len];         memcpy(data,b.data,Len);         cout<<_T("调用operator = 函数.  memcpy")<<endl;         return *this;     }            ObjA(const ObjA &b)     {         cout<<_T("调用拷贝构造函数. memcpy")<<endl;         if (this!=&b)         {             int Len=strlen(b.data);             data=new char[Len];             memcpy(data,b.data,Len);         }     }                              //Move拷贝构造函数     ObjA(ObjA &&b)     {         cout<<"Move拷贝构造函数"<<endl;         if (this!=&b)         {             data=b.data;             b.data=NULL;         }     }            //Move赋值拷贝     ObjA& operator=(ObjA &&b)     {         cout<<_T("Move operator = 函数.")<<endl;         if (this!=&b)         {             data=b.data;             b.data=NULL;         }                return *this;     }                   char *data; };               ObjA testRValue_ChangeStr(ObjA o) {     delete[] o.data;     char *tmp="string after change";     int Len=strlen(tmp);     o.data=new char[Len];     memcpy(o.data,tmp,Len);            return o; }              int _tmain(int argc, _TCHAR* argv[]) { //实现了Move拷贝和Move赋值函数.即只移动内部指针,不移动数据.     ObjA a("obj A");     ObjA b("obj B");              b=testRValue_ChangeStr(a); //由于text...函数返回的是个临时对象,即右值 //所以ObjA的    ObjA& operator=(ObjA &&b)函数被调用. //b Move拷贝了testRVa...函数返回的临时对象的数据.                   //test vector                   vector<ObjA> *v=new vector<ObjA>;     //push_back每调用一次,就会调用Move拷贝构造函数     //把旧内存里的对象移至新分配的内存里去.                v->push_back(*new ObjA("C"));      v->push_back(*new ObjA("D"));     v->push_back(*new ObjA("E"));     //以上总共调用了三次memcpy函数,移动数据                   return 0; }



相关文章

  • 关于C++ 0x的右值引用

    右值引用(及其支持的Move语意和完美转发)是C++0x将要加入的最重大语言特性之一.从实践角度讲,它能够完美解决...

  • 右值引用

    参考资料 谈谈 C++ 中的右值引用C++11 左值、右值、右值引用详解

  • C++11那些难事:左值引用、右值引用与完美转发

    上一篇C++那些难事:左值与右值搞明白左值与右值,下面讲解左值引用与右值引用。 1. 左值引用与右值引用 左值右值...

  • C++右值引用

    C++ 右值引用译

  • 左值右值引用和移动构造

    左值与右值 左值引用右值引用 C++ 11中用&表示左值引用,用&&表示右值引用 (move函数可以把一个) 进...

  • 右值引用小结

    今天总结下右值的那些事儿 什么是右值 右值的必要性 move函数 什么是右值 传统c++的引用就是左值引用,使得标...

  • C++ 引用类型 — 左值引用、常引用和右值引用

    在 C++ 中,引用类型是一种复合类型,可以分为左值引用、常引用和右值引用 在了解什么是左值引用和右值引用之前,我...

  • C++之左值、右值、左值引用、右值引用

    From CSDN 絮语清风 / CSDN hyman_yx 左值和右值 左值是可以放在赋值号左边可以被赋值的值;...

  • C++右值引用

    C++右值引用 右值引用应该是C++11引入的一个非常重要的技术,因为它是移动语义(Move semantics)...

  • c++右值引用

    右值引用是什么,把它拆开来说,首先是个引用,即一个变量的绑定或别名。然后这个变量是右值,可以理解为临时变量。右值是...

网友评论

      本文标题:关于C++ 0x的右值引用

      本文链接:https://www.haomeiwen.com/subject/puqttttx.html