// RightValue.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream>
#include <algorithm>
#include <vector>
#include <ctime>
using namespace std;
class CMyObj{
protected:
unsigned m_iBufferSize;
char* m_pBuffer;
public:
CMyObj():m_iBufferSize(0),m_pBuffer(NULL){}
CMyObj(unsigned int iBufSize):
m_iBufferSize(iBufSize)
{
m_pBuffer = new char[iBufSize];
memset(m_pBuffer,0,m_iBufferSize);
}
CMyObj(const CMyObj& objSrc){
m_iBufferSize = objSrc.m_iBufferSize;
if(m_iBufferSize > 0){
m_pBuffer = new char[m_iBufferSize];
memcpy(m_pBuffer,objSrc.m_pBuffer,m_iBufferSize);
}
}
~CMyObj(){
if(m_pBuffer) delete m_pBuffer;
m_pBuffer = NULL;
}
};
class CMyObjWithMoveConstructor:public CMyObj
{
public:
CMyObjWithMoveConstructor():CMyObj(){}
CMyObjWithMoveConstructor(int iBufSize)
:CMyObj(iBufSize){}
//copy constructor
CMyObjWithMoveConstructor(const CMyObjWithMoveConstructor& myObj)
:CMyObj(myObj){}
//move constructor
CMyObjWithMoveConstructor(CMyObjWithMoveConstructor&& myObj){
m_iBufferSize = myObj.m_iBufferSize;
m_pBuffer = myObj.m_pBuffer;
myObj.m_pBuffer = NULL;
myObj.m_iBufferSize = 0;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
static int iBufSize = 1024*1024*2; //2M
static int iObjCnt = 100;
clock_t t1,t2;
double times;
vector<CMyObj> vec;
t1 = clock();
//没有右值引用
for( int i = 0; i < iObjCnt; i ++){ //加入100个元素
vec.push_back( CMyObj(iBufSize));
}
t2 = clock();
times = (double)(t2-t1)/CLOCKS_PER_SEC;
cout<<"without move constructor:"<<times<<endl;
vector<CMyObjWithMoveConstructor> vec2;
t1 = clock();
//有右值引用
for( int j = 0; j < iObjCnt; j ++){ //加入100个元素
vec2.push_back( CMyObjWithMoveConstructor(iBufSize));
}
t2 = clock();
times = (double)(t2-t1)/CLOCKS_PER_SEC;
cout<<"with move constructor:"<<times<<endl;
return 0;
}
//最后结果:
//without move constructor:1.48
//with move constructor:0.16
//相差了9.25倍
分享到:
相关推荐
C++11的新特性。尤其是lamda表达式,使得C++灵活了很多
引用类型可被引用的类型注记非常量左值常量左值非常量右值常量右值非常量左值引用// ncLeft1为非常量左值int ncLeft1 = 2;该引用类型本身为常量
在c++11中,支持右值引用,右值引用的用处之一是移动语义,对象的资源所有权发生转移,在c++11之前,移动语义的缺失是c++饱受诟病的问题之一. 什么是左值?什么是右值? 凡有名者,皆为左值.左值对应变量的存储位置...
右值引用(及其支持的Move语意和完美转发)是C++0x将要加入的最重大语言特性之一,这点从该特性的提案在C++ – State of the Evolution列表上高居榜首也可以看得出来。 从实践角度讲,它能够完美解决C++中长久以来...
为了解决移动语义及完美转发问题,C++11标准引入了右值引用(rvalue reference)这一重要的新概念。右值引用采用T&&这一语法形式,比传统的引用T&(如今被称作左值引用 lvalue reference)多一个&。 如果把经由T&&...
右值引用(及其支持的Move语意和完美转发)是C++0x将要加入的最重大语言特性之一。从实践角度讲,它能够完美解决C++中长久以来为人所诟病的临时对象效率问题。从语言本身讲,它健全了C++中的引用类型在左值右值方面...
下面小编就为大家带来一篇浅谈C++左值引用和右值引用。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
这一系列文章来自Visual C++ Team Blog,介绍Microsoft Visual Studio 2010 中支持的C++0x特性,目前有三部分。 Part 1:介绍了Lambdas,auto,以及 static_assert; Part 2:介绍了右值引用(Rvalue References)...
第一次接触c++move操作就懵逼了,一直想探个究竟,但是右值以及右值引用思考了好长时间,就是不得要领,今天终于有所收获,写下第一篇博客,一方面为了帮助一些刚入门的朋友,另一方面也是帮助自己今后复习。...
c++11 右值引用和移动语义(csdn)————程序
C++11新标准中一个最主要的特性就是提供了移动而非拷贝对象的能力。如此做的好处就是,在某些情况下,对象拷贝后就立即被销毁了,此时如果移动而非拷贝对象会大幅提升性能。参考如下程序: //moveobj.cpp #include ...
C++已经够复杂了,C++11中引入的新特性令C++更加复杂了。在学习本文的时候一定要理解清楚左值、右值、左值引用和右值引用。 移动构造函数 首先看一个C++98中的关于函数返回类对象的例子。 class MyString {
为了支持移动操作,新标准引入了一种新的引用类型——右值引用,就是必须绑定到右值的引用。我们通过&&而不是&来获得右值引用。右值引用一个重要的特性就是只能绑定到将要销毁的对象。 左值和右值是表达式的属性,...
右值简单而言就是一种无法被取地址,而且只是在一个小范围内临时被使用的(C++11引入) int&& a = 10; 针对右值,引申出临终值的概念 临终值:1 可以跟左值一样被取地址 2 将要释放或者移走 static_cast() 和 std::...
这一系列文章介绍Microsoft Visual Studio 2010 中支持的C++ 0x特性。 Part 1 :介绍了Lambdas, 赋予新意义的auto,以及 static_assert; Part 2( 1 , 2 ):介绍了右值引用(Rvalue References); Part 3:介绍了...
左值:可以取地址的,有名字的,临时的右值:不能取地址的,没有名字的,临时的举个栗: int a = b + c ,a 就是左值,其变量名为 a ,通过 &a 可
这是关于C++左值与右值引用的课程视频,课程易于理解,可以很快掌握