關鍵字:c++11,右值引用,rvalue,std::move,vs 2015
os:windows 10
右值引用(及其支援的move語意和完美**)是c++0x加入的最重大語言特性之一。從實踐角度講,它能夠完美解決c++中長久以來為人所詬病的臨時物件效率問題。從語言本身講,它健全了c++中的引用型別在左值右值方面的缺陷。從庫設計者的角度講,它給庫設計者又帶來了一把利器。從庫使用者的角度講,不動一兵一卒便可以獲得「免費的」效率提公升…
下面用例項來深入**右值引用。
#include "stdafx.h
"#include
class
a a(
const a&)
~a() {}
};static
a geta()
intmain()
執行以上**,輸出結果如下:
constructorcopy constructor
可以看到a的構造函式呼叫一次,拷貝構造函式呼叫了一次,建構函式和拷貝建構函式是消耗比較大的,這裡是否可以避免拷貝構造?c++11做到了這一點。
#include "stdafx.h
"#include
class
a a(
const a&)
a(
const a&&)
~a() {}
};static
a geta()
intmain()
執行以上**,輸出結果:
constructormove constructor
這樣就沒有呼叫拷貝建構函式,而是呼叫移動構造。這裡並沒有看到移動構造的優點。
#include "stdafx.h
"#include
#include
class
b b(
const b&)
};class
a a(
const a&src) :
m_b(
new b(*(src.m_b)))
a(a&&src) :
m_b(src.m_b)
~a()
private
:b
*m_b;
};static
a geta()
intmain()
執行以上**,輸出結果:
a constructor*********************************************===a move constructor
*********************************************===b constructor
a copy constructor
「 a a
=geta();」呼叫的是a的移動構造,「
a a1(a);
」呼叫的是a的拷貝構造。a的拷貝構造需要對成員變數b進行深拷貝,而a的移動構造不需要,很明顯,a的移動構造效率高。
#include "stdafx.h
"#include
#include
class
b b(
const b&)
};class
a a(
const a&src) :
m_b(
new b(*(src.m_b)))
a(a&&src) noexcept :
m_b(src.m_b)
~a()
private
: b*m_b;
};static
a geta()
intmain()
執行以上**,輸出結果:
a constructor*********************************************===a move constructor
*********************************************===b constructor
a copy constructor
*********************************************===a move constructor
「 a a2(std::move(a1));」將a1轉換為右值,因此a2呼叫的移動構造而不是拷貝構造。
#include "stdafx.h
"#include
#include
class
b b(
const b&)
};class
a a(
const a&src) :
m_b(
new b(*(src.m_b)))
a(a&&src) :
m_b(src.m_b)
a& operator=(const a&src) noexcept
a& operator=(a&&src) noexcept
~a()
private
: b*m_b;
};static
a geta()
intmain()
執行以上**,輸出結果:
a constructor*********************************************===a move constructor
*********************************************===b constructor
a copy constructor
*********************************************===a move constructor
*********************************************===a constructor
*********************************************===a move constructor
operator=(const a&&src)
*********************************************===b constructor
operator=(const a& src)
總之盡量給類新增移動構造和移動賦值函式,而減少拷貝構造和拷貝賦值的消耗。 移動構造,移動賦值要加上noexcept,用於通知標準庫不丟擲異常。
C 11 右值引用以及std move
int和int 是什麼?都是型別。int是整數型別,int 則是整數引用型別。相同int 也是乙個型別。兩個引號 是c 11提出的乙個新的引用型別。記住,這是乙個新的型別。默念 10次吧。假設你記住這個新型別,那麼非常多疑問都能迎刃而解。而且對 effective modern c 說到的void ...
C 11中的右值引用以及std move
看了很多篇文章,現在終於搞懂了c 中的右值以及std move 左值和右值最重要的區別就是右值其實是乙個臨時的變數 在c 11中,也為右值引用增加了新語法,即 比如如下 void testfunc int i void testfunc int i intmain 此時輸出為 right value...
std move和右值引用
右值引用允許程式設計人員去避免不必要的記憶體拷貝,從而提高效能。我們知道如果乙個類a的成員變數中有指標,那麼就要考慮深拷貝和淺拷貝了,深拷貝通常要實現下面幾個函式 建構函式 拷貝構造 賦值操作符 這樣做是沒問題的,但是會帶來乙個問題,會造成一些沒必要的拷貝,如 std string str hell...