C 11右值引用和std move語句例項解析

2022-08-09 08:42:11 字數 3615 閱讀 5560

關鍵字: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()

執行以上**,輸出結果如下:

constructor

copy constructor

可以看到a的構造函式呼叫一次,拷貝構造函式呼叫了一次,建構函式和拷貝建構函式是消耗比較大的,這裡是否可以避免拷貝構造?c++11做到了這一點。

#include "

stdafx.h

"#include

class

a a(

const a&)

a(

const a&&)

~a() {}

};static

a geta()

intmain()

執行以上**,輸出結果:

constructor

move 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...