程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> 非常直白的對move語義和右值引用的解釋

非常直白的對move語義和右值引用的解釋

編輯:JAVA綜合教程

非常直白的對move語義和右值引用的解釋


move語義和右值引用:

先參考: http://www.cnblogs.com/tingshuo/archive/2013/01/21/2870035.html


c++中臨時對象可能會大量存在,比如string/STL調用中。臨時對象中的資源(buffer或者字符串)會隨著臨時對象的析構而消失,所以一般會在對象析構前把它們(資源)拷貝出來,而不會直接引用這些資源,否則會野指針。

其實,既然已經是臨時對象了,馬上就會被析構掉,所以趕在析構前改一下裡面的內容也不會帶來太多負面影響,當然是在控制良好的前提下。基於這個思路,我們可以放心大膽的直接引用臨時對象中的資源指針(比如指針賦值,引用該資源),然後把它置空(防止被臨時對象釋放掉,囧),或者更屌一點的,把我們意圖釋放的指針,直接賦值給臨時對象的該指針,借助臨時對象在析構時會釋放它的資源的時機,把我們想釋放的東西給釋放掉!

多麼精妙!

在c11之前,臨時對象只能以 const MyClass& my_object 這種方式傳遞,有const在,所以臨時對象是不能被修改的。但是c11引入了右值引用 MyClass&&,導致我們可以修改臨時變量了!

假如你是函數的提供者,你提供了帶右值引用的參數,那麼,你就大膽的去引用它的資源,修改它的資源吧,不用擔心它還會被使用到,當函數返回之後。因為它是右值引用,該函數的調用者會保證這個參數不會再被使用到。

假如你是函數的調用者,當你發現你有一個左值對象my_object即將不再被使用到了,就可以用move語義把它轉成右值引用丟給函數,任函數去修改它的內容無所謂,因為你確定它不再被使用了(如果你確定不了,那就不能使用move語義)。當然,假如你處理的已經是右值了(比如函數返回值),那就跟以前沒什麼兩樣。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved