c++11——move/forward
2015-09-13 21:49
399 查看
[b]std::move[/b]
c++11中提供了std::move()来将左值转换为右值,从而方便的使用移动语义。move是将对象的状态或者所有权从一个对象转移到另一个对象,只是转移,没有内存拷贝。
c++中所有容器都实现了move语义,方便我们实现性能优化。move只是转移了资源的控制权,本质上是将左值强制转换为右值引用,以用于move语义,避免含有资源的对象发生无谓的拷贝。move对于拥有形如对内存、文件句柄等资源的成员的对象有效。如果是一些基本类型,比如int或char[10]数组等,如果使用move,仍然会发生拷贝(因为没有对应的移动构造函数),所以move对于含资源的对象来说更有意义。
[b]std::forward[/b]
右值引用类型是独立于值的,一个右值引用参数作为函数的形参,在函数内部再转发该参数的时候它已经变成一个左值,并不是他原来的类型。
如果我们需要一种方法能够按照参数原来的类型转发到另一个函数,这种转发类型称为完美转发。
c++11中提供了std::move()来将左值转换为右值,从而方便的使用移动语义。move是将对象的状态或者所有权从一个对象转移到另一个对象,只是转移,没有内存拷贝。
c++中所有容器都实现了move语义,方便我们实现性能优化。move只是转移了资源的控制权,本质上是将左值强制转换为右值引用,以用于move语义,避免含有资源的对象发生无谓的拷贝。move对于拥有形如对内存、文件句柄等资源的成员的对象有效。如果是一些基本类型,比如int或char[10]数组等,如果使用move,仍然会发生拷贝(因为没有对应的移动构造函数),所以move对于含资源的对象来说更有意义。
std::list<std::string> tokens; std::list<std::string> t = std::move(tokens); //发生了移动构造。list在实现的时候,是将目的对象的资源句柄赋值为源对象的资源句柄,而将源对象的资源句柄清空。
[b]std::forward[/b]
右值引用类型是独立于值的,一个右值引用参数作为函数的形参,在函数内部再转发该参数的时候它已经变成一个左值,并不是他原来的类型。
如果我们需要一种方法能够按照参数原来的类型转发到另一个函数,这种转发类型称为完美转发。
template<typename T> void print(T& t){ cout << "lvalue" << endl; } template<typename T> void print(T&& t){ cout << "rvalue" << endl; } template<typename T> void TestForward(T && v){ print(v); print(std::forward<T>(v)); print(std::move(v)); } int main(){ TestForward(1); int x = 1; TestForward(x); TestForward(std::forward<int>(x)); return 0; }
相关文章推荐
- 【LeetCode从零单刷】Convert Sorted Array to Binary Search Tree
- c++字符串操作函数
- C++基础知识总结--指针
- C++ STL中的关于堆的函数
- 实现C++实用的时间库
- 【LeetCode从零单刷】Single Number III
- C语言实现单链表-01版
- Effective C++ —— 实现(五)
- C++模板的一些巧妙功能
- C++模板的一些巧妙功能
- C语言初步接触
- 设计模式C++实现(8)——代理模式
- 设计模式C++实现(7)——外观模式、组合模式
- 设计模式C++实现(6)——建造者模式(Builder)
- 设计模式C++实现——简单工厂(并不在23种之中)
- 设计模式C++实现(2)——策略模式
- 设计模式C++实现(3)——适配器模式
- 设计模式C++实现(4)——饿汉懒汉之单例模式
- 浅谈C/C++引用和指针的联系和区别
- c++11——右值引用