C++ 已经拥有了拷贝构造函数, 和赋值函数,它们主要定位为浅和深度拷贝, 新增加一个移动构造函数,主要避免拷贝构造。

在定义了移动构造函数的情况下,在实参(argument)是一个右值(rvalue,包括xvalue和prvalue)的情况下会调用移动构造函数,而不是调用复制构造函数

可以使用std::move语句可以将左值变为右值而避免拷贝构造,修改代码如下:

编译器会对返回值进行优化,简称RVO,是编译器的一项优化技术,它涉及(功能是)消除为保存函数返回值而创建的临时对象。

-fno-elide-constructors,此选项作用是,在 g++ 上编译时关闭 RVO。

shell> g++ main.cpp -std=c++11 -fno-elide-constructors

#include <iostream>
using namespace std; class Test
{
public:
Test(int a = 0)
{
d = new int(a);
cout << "cs" << this <<endl;
} Test(const Test & tmp)
{
d = new int;
*d = *(tmp.d);
cout << "copy\n";
} // Test(Test && tmp)
// { // 移动构造函数
// d = tmp.d;
// tmp.d = NULL; // 将临时值的指针成员置空
// cout << "mv" << this << endl;
// } ~Test()
{
if(d != NULL)
{
delete d;
cout << "delete d\n";
}
cout << "ds: " << this << endl;
} int * d;
}; Test GetTmp()
{
Test h;
cout << "Resource from " << __func__ << ": " << (void *)h.d << endl;
return h;
} int main()
{
//Test&& obj = GetTmp();
Test obj = GetTmp();
cout << "Resource from " << __func__ << ": " << (void *)obj.d << endl; return 0;
}

  

 

  使用移动语义后

#include <iostream>
using namespace std; class Test
{
public:
Test(int a = 0)
{
d = new int(a);
cout << "cs" << this <<endl;
} Test(const Test & tmp)
{
d = new int;
*d = *(tmp.d);
cout << "copy\n";
} Test(Test && tmp)
{ // 移动构造函数
d = tmp.d;
tmp.d = NULL; // 将临时值的指针成员置空
cout << "mv" << this << endl;
} ~Test()
{
if(d != NULL)
{
delete d;
cout << "delete d\n";
}
cout << "ds: " << this << endl;
} int * d;
}; Test GetTmp()
{
Test h;
cout << "Resource from " << __func__ << ": " << (void *)h.d << endl;
return h;
} int main()
{
Test&& obj = GetTmp();
cout << "Resource from " << __func__ << ": " << (void *)obj.d << endl; return 0;
}

  

 

  

int main()
{
//Test&& obj = GetTmp();
Test obj = GetTmp();
cout << "Resource from " << __func__ << ": " << (void *)obj.d << endl; return 0;
}

  

c++ 11 移动语义的更多相关文章

  1. C++11移动语义之一(基本概念)

    摘要 移动语义是C++11的新特性之一,利用移动语义可以实现对象的移动而非拷贝.在某些情况下,可以大幅度的提升性能.本文将介绍C++11移动语义中的一些基本概念. 表达式 表达式是由一个或者多个运算对 ...

  2. c++ 11 移动语义、std::move 左值、右值、将亡值、纯右值、右值引用

    为什么要用移动语义 先看看下面的代码 // rvalue_reference.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #includ ...

  3. c++11 移动语义move semantics

    performance, expensive object copies move semantics, temporary objects implemented with rvalue refer ...

  4. 冒号课堂 编程范式与OOP思想

    上篇:编程范式与编程语言 第1课 开班导言 第2课 重要范式 第3课 常用范式 第4课 重温范式 第5课 语言小谈 第6课 语言简评 下篇:抽象机制与对象范式 第7课 抽象封装 第8课 抽象接口 第9 ...

  5. 《实战突击:PHP项目开发案例整合(第2版)(含DVD光盘1张)》

    <实战突击:PHP项目开发案例整合(第2版)(含DVD光盘1张)> 基本信息 作者: 徐康明    辛洪郁 出版社:电子工业出版社 ISBN:9787121221378 上架时间:2014 ...

  6. 【C++ STL应用与实现】18: 怎样使用迭代器适配器

    本系列文章的文件夹在这里:文件夹. 通过文件夹里能够对STL整体有个大概了解 前言 本文介绍了STL中的迭代器适配器(iterator adapter)的概念及其用法演示样例.迭代器适配器能够和标准库 ...

  7. 地区sql

    /*Navicat MySQL Data Transfer Source Server : localhostSource Server Version : 50136Source Host : lo ...

  8. c++11的右值引用、移动语义

    对于c++11来说移动语义是一个重要的概念,一直以来我对这个概念都似懂非懂.最近翻翻资料感觉突然开窍,因此记下.其实搞懂之后就会发现这个概念很简单,并无什么高深的地方. 先说说右值引用.右值一般指的是 ...

  9. 【转】C++11 标准新特性: 右值引用与转移语义

    VS2013出来了,对于C++来说,最大的改变莫过于对于C++11新特性的支持,在网上搜了一下C++11的介绍,发现这篇文章非常不错,分享给大家同时自己作为存档. 原文地址:http://www.ib ...

随机推荐

  1. npm 清理缓存

    npm cache clean -f 有些时候npm下载资源出错,再次下载的时候可能因为之前错误的缓存造成一直下载不成功. 此时可以清一下npm的缓存,然后尝试重新下载

  2. 了解C语言

    初学时的程序都需要打#include<stdio.h>及int main()  //int main中int 声明函数类型为整形,main为主函数:‘//’为注释的意思,后面的内容不会运行 ...

  3. 复旦大学2017--2018学年第一学期高等代数I期末考试情况分析

    一.期末考试成绩班级前十名 郭宇城(100).魏一鸣(93).乔嘉玮(92).刘宇其(90).朱柏青(90).王成文健(90).方博越(88).熊子恺(88).张君格(88).崔镇涛(87).史书珣( ...

  4. spring初体验 一之helloworld

    今天开始学习spring,每天都会将自己学习的一些内容,或是一些总结以博客的形式记录下来,方便自己以后回顾,如果能给他人学习带来丁点的帮助那也是最好不过了.本系列博文的spring学习是基于4.0版本 ...

  5. 浅谈Static

    A: 使用场景 static可以修饰成员变量和成员方法. 什么时候使用static修饰成员变量? 加static修饰成员的时候,这个成员会被类的所有对象所共享.一般我们把共性数据定义为静态的变量 什么 ...

  6. vs2015 ncnn

    1.vs2015编译器编译protobuf   (VS2015 x64本机工具命令) 下载源码:https://github.com/google/protobuf/archive/v3.4.0.zi ...

  7. vue 模仿机票自定义日历组件,区间选择

    1.创建组件  components > calander > index.vue <template> <div class="page" v-if ...

  8. C++句柄解析

    C++句柄类解析 引题:在C++中,对于运行时类型识别问题.在程序中使用引用或者指针在运行时动态识别对象类型.然而使用指针或者引用却增加了用户负担(在继承体系中,没有明确的基类到派生类的转换,必须用户 ...

  9. centos7.4安装nginx

    参考地址: https://blog.csdn.net/weixin_41048363/article/details/80236663 我这里没有使用阿帕奇之类的服务器,只搭建了node环境.所以并 ...

  10. mysql添加字段语句

    1.添加 varchar类型的字段: alter table b_warehouse_message add column entity_warehouse_no_test varchar(48) C ...