右值引用
作為最重要的一項語言特性,右值引用(rvalue references)被引入到 C++0x中。我們可以通過操作符“&&”來聲明一個右值引用,原先在C++中使用“&”操作符聲明的引用現(xiàn)在被稱為左值引用。
int a; int& a_lvref = a; // 左值引用
int b; int&& b_rvref = b; // 右值應(yīng)
用左值引用和右值引用的表現(xiàn)行為基本一致,它們唯一的差別就是右值引用可以綁定到一個臨時對象(右值)上,而左值引用不可以。例如:
int& a_lvref = int(); // error C2440: 'initializing' : cannot convert from 'int' to 'int &' int&& b_rvref = int(); // OK!
在第一行代碼中,我們將一個臨時對象int()綁定到一個左值引用,將產(chǎn)生一個編譯錯誤。而在第二行中,我們將臨時對象綁定到右值引用,就可以順利通過編譯。
右值是無名的數(shù)據(jù),例如函數(shù)的返回值一般說來就是右值。當(dāng)對右值進(jìn)行操作的時候,右值本身往往沒有必要保留,因此在某些情況下可以直接“移動”之。通過右值引用,程序可以明確的區(qū)分出傳入的參數(shù)是否為右值,從而避免了不必要的拷貝,程序的效率也就得到了提高。我們考慮一個簡單的數(shù)據(jù)交換的小程序,從中來體會右值引用所帶來的效率提升。我們可以寫一個函數(shù)swap來實現(xiàn)兩個變量值的交換:
template <class T> swap(T& a, T& b) { T tmp(a); // tmp對象創(chuàng)建后,我們就擁有了a的兩份拷貝 a = b; // 現(xiàn)在我們擁有b的兩份拷貝 b = tmp; // 現(xiàn)在我們擁有a的兩份拷貝 }
在這段代碼中,雖然我們只是為了進(jìn)行簡單的數(shù)據(jù)交換,但是卻執(zhí)行了多次對象拷貝。這些對象的拷貝操作,特別是當(dāng)這些對象比較大的時候,無疑會影響程序的效率。
那么,如果使用右值引用如何實現(xiàn)呢?
// RValueRef.cpp : Defines the entry point for the console application. //
#include "stdafx.h"
template <class T> T&& move(T&& a) { return a; }
template <class T> void swap(T& a, T& b) { T tmp(move(a)); // 對象a被移動到對象tmp,a被清空 a = move(b); // 對象b被移動到對象a,b被清空 b = move(tmp); // 對象tmp被移動到對象b }
int _tmain(int argc, _TCHAR* argv[]) { int a = 1; int b = 2; swap(a, b);
return 0; }
在這段重新實現(xiàn)的代碼中,我們使用了一個move()函數(shù)來代替對象的賦值操作符“=”,move()只是簡單地接受一個右值引用或者左值引用作為參數(shù),然后直接返回相應(yīng)對象的右值引用。這一過程不會產(chǎn)生拷貝(Copy)操作,而只會將源對象移動(Move)到目標(biāo)對象。
正是拷貝(Copy)和移動(Move)的差別,使得右值引用成為C++0x中最激動人心的新特性之一。從實踐角度講,它能夠完美是解決C++中長久以來為人所詬病的臨時對象的效率問題。從語言本身講,它健全了C++中的引用類型在左值右值方面的缺陷。從庫設(shè)計者的角度講,它給庫設(shè)計者又帶來了一把利器。而對于廣大的庫使用者而言,不動一兵一卒便能夠獲得“免費的”效率提升。
在Visual Studio 2010中,因為有了對這些C++0x新特性的支持,重新點燃了程序員們對C++的熱情。C++重振雄風(fēng),指日可待!
本文鏈接:http://www.95time.cn/computer/soft/2009/7138.asp
出處:藍(lán)色理想
責(zé)任編輯:bluehearts
上一頁 VS 2010 C++的未來:0x 的新特性 [3] 下一頁
◎進(jìn)入論壇計算機技術(shù)版塊參加討論
|