Move semantics(C++11)
/*
* Compile with:
* g++ move_test.c -o move_test -std=c++11 -g -fno-elide-constructors
* -fno-elide-constructors disabled the return value optimize.
*/
#include <iostream>
#include <utility>
class A {
public:
A(void)
{
a = new int;
std::cout << "Constructing(normal) A" << (void *)this << std::endl;
}
A(const class A &other)
{
std::cout << "Constructing(copy) A" << (void *)this << std::endl;
}
A(class A &&other)
{
std::cout << "Constructing(move) A" << (void *)this << std::endl;
a = other.a;
other.a = NULL;
}
~A(void)
{
std::cout << "Destructing A" << (void *)this << std::endl;
delete a;
}
void set(int i)
{
*a = i;
}
int get(void)
{
return *a;
}
private:
int *a;
};
class B {
private:
class A a;
public:
B(void)
{
std::cout << "Constructing(normal) B" << (void *)this << std::endl;
}
B(const class B &other)
: a(other.a)
{
std::cout << "Constructing(copy) B" << (void *)this << std::endl;
}
B(class B &&other)
:a(std::move(other.a))
{
std::cout << "Constructing(move) B" << (void *)this << std::endl;
}
~B(void)
{
std::cout << "Destructing B" << (void *)this << std::endl;
}
void set(int i)
{
a.set(i);
}
int get(void)
{
a.get();
}
};
class B func(void)
{
class B b;
b.set(23);
std::cout << "function Seperating..." << std::endl;
std::cout << b.get() << std::endl;
return b;
}
int main(void)
{
class B b(func());
std::cout << b.get() << std::endl;
b.set('w');
std::cout << "Seperating..." << std::endl;
std::cout << b.get() << std::endl;
return 0;
}
Running results:
Constructing(normal) A0xbf965d1c
Constructing(normal) B0xbf965d1c
function Seperating...
23
Constructing(move) A0xbf965d4c
Constructing(move) B0xbf965d4c
Destructing B0xbf965d1c
Destructing A0xbf965d1c
Constructing(move) A0xbf965d48
Constructing(move) B0xbf965d48
Destructing B0xbf965d4c
Destructing A0xbf965d4c
23
Seperating...
119
Destructing B0xbf965d48
Destructing A0xbf965d48
Move semantics(C++11)的更多相关文章
- C++11的value category(值类别)以及move semantics(移动语义)
转载请保留以下声明 作者:赵宗晟 出处:http://www.cnblogs.com/zhao-zongsheng/p/value_categories_and_move_semantics.html ...
- c++11 移动语义move semantics
performance, expensive object copies move semantics, temporary objects implemented with rvalue refer ...
- C++11之 Move semantics(移动语义)(转)
转https://blog.csdn.net/wangshubo1989/article/details/49748703 按值传递的意义是什么? 当一个函数的参数按值传递时,这就会进行拷贝.当然,编 ...
- C++11新特性之 Move semantics(移动语义)
https://blog.csdn.net/wangshubo1989/article/details/49748703 这篇讲到了vector的push_back的两种重载版本,左值版本和右值版本.
- 右值引用和std::move函数(c++11)
1.对象移动 1)C++11新标准中的一个最主要的特性就是移动而非拷贝对象的能力 2)优势: 在某些情况下,从旧内存拷贝到新内存是不必要的,此时对对象进行移动而非拷贝可以提升性能 有些类如IO类或un ...
- C++11的new concepts (move semantic)
MoveConstructible 和MoveAssignable MoveConstructible Specifies that an instance of the type can be mo ...
- C++11 move语意
C++11带来的move语义 C++11引入了move语义,stl中的容器基本都支持move语义,因此我们在使用stl中的容器的时候,就已经使用过move语义了,在网上看了不少关于mo ...
- 【C/C++】C++11 Move, Forward
左值与右值 Lvalue:可以出现在 operator= 左边的 Rvalue:只能出现在operator= 右边的 ; int a = b; a = b; a = a + b; a + b = a; ...
- 推荐使用C++ 11
如果你的代码工作正常并且表现良好,你可能会想知道为什么还要使用C++ 11.当然了,使用用最新的技术感觉很好,但是事实上它是否值得呢? 在我看来,答案毫无疑问是肯定的.我在下面给出了9个理由,它们分为 ...
随机推荐
- KJBitmap与KJHttp的深度用法
摘要 本文原创,转载请注明地址:http://kymjs.com/code/2015/09/24/01这篇文章是对KJFrameForAndroid使用的一个深入学习 之前写过一些有关KJFrame的 ...
- Ext.state.Manager.setProvider(new Ext.state.CookieProvider())
Ext.state.Manager.setProvider(new Ext.state.CookieProvider()) 初始化Ext状态管理器,在Cookie中记录用户的操作状态,如果不启用,象刷 ...
- java线程的一些基础小知识
--------------------------------------------------------------------------------------------------线程 ...
- CVS环境搭建
1.下载cvsnt(可以从附件中下载) 2.安装cvsnt 直接双击运行cvsnt安装文件,安装过程中可以选择以经典.自定义和完全三种方式安装,在自定义方式中可以选择安装路径.安装完成后,在控 ...
- JAVA压缩解压ZIP文件,中文乱码还需要ANT.JAR包
package zip; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStrea ...
- coursera课程Text Retrieval and Search Engines之Week 1 Overview
Week 1 OverviewHelp Center Week 1 On this page: Instructional Activities Time Goals and Objectives K ...
- 从原型模式(Prototype Pattern)到 Clone
前面提到抽象工厂的实现,这里说说抽象工厂的原型实现,与工厂方法的实现不同,原型实现有他自己的优点和缺点 原型的优点: 1. 效率:clone是native方法,比new的效率高,当使用复杂循环嵌套对象 ...
- go语言基础之二维数组
1.二维数组 示例: package main //必须有个main包 import "fmt" func main() { //有多少个[]就是多少维 //有多少个[]就用多少个 ...
- 同时启动多个Tomcat服务器
以下步骤能够同时启动两个tomcat:1.特别要注意:不要设置CATALINA_HOME 2.分别修改安装目录下的conf子目录中的server.xml文件: a.修改http访问端口(默认为8080 ...
- OpenProcess、GetExitCodeProcess、TerminateProcess
//声明: {返回进程的句柄} OpenProcess( dwDesiredAccess: DWORD; {訪问选项} bInheritHandle: BOOL; {是否能继承; Tr ...