`
lingyibin
  • 浏览: 197174 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

VC2010中C++的右值引用新特性

阅读更多

// 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倍 
 
0
1
分享到:
评论

相关推荐

    VC10中的C++0x特性

    这一系列文章来自Visual C++ Team Blog,介绍Microsoft Visual Studio 2010 中支持的C++0x特性,目前有三部分。 Part 1:介绍了Lambdas,auto,以及 static_assert; Part 2:介绍了右值引用(Rvalue References)...

    VC10中的C++0x特性.pdf

    以上就是Microsoft Visual Studio 2010中支持的C++0x特性的一些概述。这些特性不仅增强了C++的表达能力,还提高了程序的性能和可维护性。对于任何希望利用现代C++特性的开发者来说,了解和掌握这些特性是非常重要的...

    VC2010 C++ MFC sample

    C++ 2010是C++标准的一个里程碑,引入了若干新特性,例如: 1. **Rvalue References(右值引用)**: 这个特性允许更高效地处理临时对象,通过移动语义(Move Semantics)实现对象所有权的转移,从而提高性能。 2. ...

    Visual C++ 2010 Express sp1 独立安装包

    1. 改进的C++0x支持:Visual C++ 2010 SP1提供了对C++最新标准C++0x的更好支持,包括智能指针、lambda表达式和右值引用等新特性。 2. 更快的编译速度:SP1优化了编译器,使得编译时间得到显著减少,提高了开发效率。...

    C++0x_新特性.pdf

    C++0x引入了一系列新特性和改进,这些新特性对C++语言进行了现代化的增强,旨在提高编程效率、性能和表达能力。以下将详细解释文档中提及的关键知识点。 1. R-value References(右值引用) 在C++0x中,引入了右值...

    易语言vc6linker_VC7_VC8_VC9_VC2010_连接器

    最后,vc2010linker是为Visual C++ 2010设计的,这个版本引入了更多的C++11标准特性,如lambda表达式和右值引用。vc2010linker使得易语言编译器能够利用这些现代C++特性,提升程序的效率和可读性。 每个版本的链接...

    VC11 C++ 编译器

    **C++11新特性** 1. **Lambda表达式**:C++11引入了lambda表达式,使得在代码中定义匿名函数变得更加简单和直观。Lambda可以用于创建闭包,即能够捕获周围作用域中的变量,这在处理函数对象和异步编程时非常有用。 ...

    vc6+vc7+vc8+vc9+vc2010+连接转换器.7z

    5. **Visual C++ 2010/10.0**:正式支持C++11标准,包括lambda表达式、右值引用等新特性。此外,对C++/CLI进行了增强,改进了性能和IDE用户体验。 易语言的连接转换器可能涉及以下技术: - **COM(Component ...

    VC 运行库 合集 Visual C++ Redistributab 2005 2208 2010 2013

    它增强了C++11标准的支持,并引入了更多C++14的新特性,如lambda表达式、右值引用和并发编程改进。 这些运行库不仅对运行使用相应版本的Visual C++编译的软件至关重要,而且在某些情况下也是其他非Microsoft软件的...

    vc++2010学习版(Microsoft Visual C++ 2010 Express)

    这意味着用户可以利用新引入的特性,如lambda表达式、右值引用、自动类型推断(auto关键字)等,这些都极大地增强了C++的表达能力和灵活性。 在界面设计上,Visual C++ 2010 Express提供了直观的图形用户界面(GUI...

    VC2010压缩包

    首先,VC2010支持C++0x标准,这是对C++语言的一次重大更新,包括了模板元编程、右值引用、自动类型推断(如`auto`关键字)以及lambda表达式等新特性。这些新功能极大地提高了代码的可读性和编写效率,使开发者能够写...

    VC2010 开发的界面程序 很美观

    VC2010支持C++11标准,为开发者带来了新的语言特性,如自动类型推断(auto)、右值引用(rvalue references)和lambda表达式等。 压缩包中的“HTControlDemo(2013-5-21 v1.0.1.0)”可能是这个界面美化程序的演示...

    Microsoft Visual C++ 2010 Express 中文.rar

    2. **编程语言支持**:作为C++的开发工具,Visual C++ 2010 Express 支持最新的C++标准,包括C++0x(即后来的C++11)的一些新特性,如lambda函数、自动类型推断(auto关键字)、右值引用等,使得代码更简洁、高效。...

    vc2015c++安装包

    C++2015是C++编程语言的一个重要版本,它引入了一些新的特性以增强语言的效率、灵活性和可读性。其中显著的改进包括: 1. **通用程序设计**:通过`auto`关键字的扩展,使得模板推导更加便捷。 2. **Lambda表达式**...

    VC运行库(vc9-vc14)

    【VC10】,对应于Visual C++ 2010,提供了MSVCR100.dll等组件,增加了对C++0x(后来的C++11)新特性的支持,例如智能指针、lambda表达式、右值引用等。安装这个运行库后,可以确保使用VC10编译的程序能正常运行。 ...

    VC 32位~64位的 Visual C++ 2008~2015 运行库.zip

    "vc11运行库"则对应Visual C++ 2012,该版本引入了对C++11标准的广泛支持,包括新的语言特性如lambda表达式、右值引用、类型推断等,以及对并行计算的改进。同时,它还支持.NET Framework 4.0和4.5。 "vc12运行库...

    VC.RedistInstaller(VC运行库文件)

    对于那些使用了C++11新特性的应用程序,如lambda表达式、右值引用等,安装VC2012运行库是必要的。 **如何解决缺少VC运行库的问题** 当用户尝试运行一个依赖特定VC++运行库的程序时,如果系统中未安装相应的库,...

    vc编程之 c++设计与演化 C++设计原理 c++编程

    8. **C++11及以后的更新**:书中可能涉及C++11、C++14和C++17等新标准引入的特性,如Lambda表达式、右值引用、auto类型推断等,这些都是现代C++编程的重要组成部分。 9. **设计模式**:书中可能会讨论一些常见的...

    VC2010编译器的

    VC2010引入了新的C++编译器,支持C++0x(后来成为C++11)的一些新特性,如自动类型推断(auto关键字)、lambda表达式、右值引用(move semantics)等。这些特性使得代码更加简洁、高效,同时也为内存管理和并发编程...

Global site tag (gtag.js) - Google Analytics