日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
分析VisualStudio右值引用

在向大家詳細介紹右值引用之前,首先讓大家了解下C++0x,然后全面介紹Visual Studio右值引用,希望對大家有用。作為最重要的一項語言特性,Visual Studio右值引用(rvalue references)被引入到 C++0x中。我們可以通過操作符“&&”來聲明一個Visual Studio右值引用,原先在C++中使用“&”操作符聲明的引用現(xiàn)在被稱為左值引用。

創(chuàng)新互聯(lián)專注于平和企業(yè)網(wǎng)站建設(shè),成都響應(yīng)式網(wǎng)站建設(shè)公司,電子商務(wù)商城網(wǎng)站建設(shè)。平和網(wǎng)站建設(shè)公司,為平和等地區(qū)提供建站服務(wù)。全流程按需網(wǎng)站開發(fā),專業(yè)設(shè)計,全程項目跟蹤,創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)

 
 
 
  1. int a;  
  2. int& aa_lvref = a;    
  3. // 左值引用  
  4.  
  5. int b;  
  6. int&& bb_rvref = b;    
  7. // 右值應(yīng)用 

左值引用和Visual Studio右值引用的表現(xiàn)行為基本一致,它們唯一的差別就是Visual Studio右值引用可以綁定到一個臨時對象(右值)上,而左值引用不可以。例如:

 
 
 
  1. int& a_lvref = int();  
  2. // error C2440: 'initializing' : cannot convert from 'int' to 'int &'      
  3. int&& b_rvref = int();  
  4. // OK! 

在***行代碼中,我們將一個臨時對象int()綁定到一個左值引用,將產(chǎn)生一個編譯錯誤。而在第二行中,我們將臨時對象綁定到Visual Studio右值引用,就可以順利通過編譯。

右值是無名的數(shù)據(jù),例如函數(shù)的返回值一般說來就是右值。當對右值進行操作的時候,右值本身往往沒有必要保留,因此在某些情況下可以直接“移動”之。通過Visual Studio右值引用,程序可以明確的區(qū)分出傳入的參數(shù)是否為右值,從而避免了不必要的拷貝,程序的效率也就得到了提高。我們考慮一個簡單的數(shù)據(jù)交換的小程序,從中來體會Visual Studio右值引用所帶來的效率提升。我們可以寫一個函數(shù)swap來實現(xiàn)兩個變量值的交換:

 
 
 
  1. template  T> swap(T& a, T& b)  
  2. {  
  3. T tmp(a);   
  4. // tmp對象創(chuàng)建后,我們就擁有了a的兩份拷貝  
  5. a = b;  
  6. // 現(xiàn)在我們擁有b的兩份拷貝  
  7. b = tmp;  
  8. // 現(xiàn)在我們擁有a的兩份拷貝  

在這段代碼中,雖然我們只是為了進行簡單的數(shù)據(jù)交換,但是卻執(zhí)行了多次對象拷貝。這些對象的拷貝操作,特別是當這些對象比較大的時候,無疑會影響程序的效率。

那么,如果使用Visual Studio右值引用如何實現(xiàn)呢?

 
 
 
  1. // RValueRef.cpp : Defines the entry point for the console application.  
  2. //  
  3.  
  4. #include "stdafx.h"  
  5.  
  6. template  T> 
  7. T&& move(T&& a)  
  8. {  
  9. return a;  
  10. }  
  11.  
  12. template  T> void swap(T& a, T& b)  
  13. {  
  14. T tmp(move(a)); 
  15. // 對象a被移動到對象tmp,a被清空  
  16. a = move(b);
  17. // 對象b被移動到對象a,b被清空  
  18. b = move(tmp);
  19. // 對象tmp被移動到對象b  
  20. }  
  21.  
  22. int _tmain(int argc, _TCHAR* argv[])  
  23. {  
  24. int a = 1;  
  25. int b = 2;  
  26. swap(a, b);  
  27.  
  28.  return 0;  

#t#在這段重新實現(xiàn)的代碼中,我們使用了一個move()函數(shù)來代替對象的賦值操作符“=”,move()只是簡單地接受一個Visual Studio右值引用或者左值引用作為參數(shù),然后直接返回相應(yīng)對象的Visual Studio右值引用。這一過程不會產(chǎn)生拷貝(Copy)操作,而只會將源對象移動(Move)到目標對象。

正是拷貝(Copy)和移動(Move)的差別,使得Visual Studio右值引用成為C++0x中最激動人心的新特性之一。從實踐角度講,它能夠***是解決C++中長久以來為人所詬病的臨時對象的效率問題。從語言本身講,它健全了C++中的引用類型在左值右值方面的缺陷。從庫設(shè)計者的角度講,它給庫設(shè)計者又帶來了一把利器。而對于廣大的庫使用者而言,不動一兵一卒便能夠獲得“免費的”效率提升。


網(wǎng)站標題:分析VisualStudio右值引用
本文網(wǎng)址:http://www.5511xx.com/article/dpjogpc.html