C++11:移动构造函数的测试

C++11:移动构造函数的测试

代码如下:

#include <iostream>
#include <stddef.h>
#include <Windows.h>

using namespace std;

class CTest
{
private:
  std::size_t size;
  char* buffer;

public:
  CTest(std::size_t size) : size(size), buffer(nullptr)
  {
    buffer = new char[size];
  }

  ~CTest()
  {
    delete[] buffer;
  }

  CTest(const CTest& other) : size(other.size), buffer(nullptr)
  {
    buffer = new char[size];
  }

  CTest(CTest&& other) : size(other.size), buffer(other.buffer)
  {
    other.buffer = nullptr;
  }
};

template <typename Func>
__int64 Benchmark(Func f, size_t count)
{
//   LARGE_INTEGER m_liPerfFreq={0};
//   //获取每秒多少CPU Performance Tick
//   QueryPerformanceFrequency(&m_liPerfFreq);
  LARGE_INTEGER li = {};
  QueryPerformanceCounter(&li);
  __int64 start = li.QuadPart;

  f(count);

  QueryPerformanceCounter(&li);
  return (li.QuadPart - start);//* 1000 / m_liPerfFreq.QuadPart;
}

void Alloc_Ref(size_t count)
{
  CTest t(1024);
  for(size_t i = 0; i < count; ++i)
    CTest c(t);
}

void Alloc_Move(size_t count)
{
  CTest t(1024);
  for(size_t i = 0; i < count; ++i)
    CTest c(std::move(t));
    //CTest c(CTest(1024));

}

int _tmain(int argc, _TCHAR* argv[])
{
  for(int i= 0; i<10 ;++i)
  {
    cout << "Move: "<< Benchmark(Alloc_Move, 1000000) << " ms." << endl;
    cout << "Ref:  " << Benchmark(Alloc_Ref, 1000000) << " ms." << endl;
  }

  system("pause");
    return 0;
}

程序运行结果如下:

结论:可见移动构造函数是拷贝构造函数的1-3倍。

参考链接:

VS 2010, Move constructor only reached after move() and slower than copy constructor?

原文地址:https://www.cnblogs.com/2018shawn/p/10967077.html

时间: 2024-10-08 18:42:14

C++11:移动构造函数的测试的相关文章

C++11 委派构造函数特性怎么使用?

在代码开发中,C语言和C++都是基础语言,是很多web开发人员的入门级必学语言.但在C++98 中,类成员构造问题还存在一些问题,为此C++11提出了一些新特性. C++98中如果一个类有多个构造函数且要实现类成员构造,这些构造函数通常要包含基本相同的类成员构造代码.在最坏的情况下,相同的类成员构造语句被拷贝粘贴在每一个构造函数中. 基于C++98中的类成员构造问题,C++11新特性中,程序员可以将公有的类成员构造代码集中在某一个构造函数里,这个函数被称为目标构造函数.其他构造函数通过调用目标构

C++中 简单查看临时对象,局部对象的生命周期,及拷贝构造函数(测试代码)

#include <iostream> using namespace std; class A {     public: A(int a = 5) {     cout<<"A constructor "<<this<<endl; } ~A() {     cout<<"A destructor "<<this<<endl; } A(const A & r) {     

C++11委派构造函数的使用方法

在代码开发中,C语言和C++都是基础语言,是很多web开发人员的入门级必学语言.但在C++98 中,类成员构造问题还存在一些问题,为此C++11提出了一些新特性. C++98中如果一个类有多个构造函数且要实现类成员构造,这些构造函数通常要包含基本相同的类成员构造代码.在最坏的情况下,相同的类成员构造语句被拷贝粘贴在每一个构造函数中. 基于C++98中的类成员构造问题,C++11新特性中,程序员可以将公有的类成员构造代码集中在某一个构造函数里,这个函数被称为目标构造函数.其他构造函数通过调用目标构

VS2010编译器工具cl对c++11标准支持情况测试

本文探讨了VS2010编译工具cl对C++11标准的支持情况,提供了利用C++11新特性的两段代码来进行测试,并同g++ 4.9.3编译器的编译情况相对比.总的说来:VS2010的编译器工具cl部分支持了C++11标准,而g++ 4.9.3则全部支持C++11标准.虽然现在已出现了C++14等新的标准,但熟悉了C++11标准的支持情况有利于我们正确选用符合自己需要的编译工具. 1. 问题产生 一个月前由于编写算法的而使用C++语言,看了一些英文版的算法设计和分析书.一个偶然的机会发现了C++11

11.2.2.2 测试列表

我们将要测试的函数是广义(generalized,是百度翻译的,不知道到底是什么意思)的版本,输出多字组成的名字:不同的是,函数结果返回名字,而不是打印.结果是有两个列表的元组:一个包含多字的名字,另一个包含单个词的名字.在函数的术语中,这个操作称为分区(partitioning),我们使用来自标准的F# 库中的List.partition 函数,很容易就能实现需要的函数: > let partitionMultiWord(names:list<string>)= names|>

[C++11] 默认构造函数

类通过一个特殊的构造函数来控制默认初始化过程,这个函数就是默认构造函数,默认构造函数无需任何实参.我们可以显示的定义默认构造函数也可以让编译器为我们生成默认构造函数.默认构造函数以如下规则初始化累的数据成员: 如果存在类内初始值,用它来初始化成员. 否则,默认初始化该成员. class Sales_data { public: std::string bookNo; unsigned units_sold = 0; double revenue = 0.0; }; 如上所示,因为Sales_da

关于构造函数的测试和小结

function Circle( radius ){ this.r = radius; this.des = "圆形"; this.showInfo = function(){ alert("这是一个"+this.des); } } function Circle_area(r){ return Circle.PI*this.r*this.r; } function Circle_perimeter(r){ return  2*Circle.PI*r;} Circl

c++11 继承构造函数

若基类拥有数量众多的不同版本的构造函数,而派生类中只有一些成员函数,则对于派生类而言,其构造函数就等同于构造基类. struct A { A(int i) {} A(double d, int i) {} A(float f, int i, const char* c) {} //... }; struct B : A { B(int i): A(i) {} B(double d, int i): A(d, i) {} B(float f, int i, const char* c): A(f,

c++11的构造函数继承

https://en.cppreference.com/w/cpp/language/using_declaration 在[Inheriting constructors]这一节. 其实叫做"基类的构造函数前置"比较好. 像mystring继承自string类,但仍然是提供字符串功能.new的时候仍旧希望保留旧有的初始化传参方式.这时候在mystring里一一再实现(调用基类)就比较麻烦. 但在c++11之前只能这样. c++11之前的默认构造方式(淡然c++11之后还是)是,先把各个基类的默