Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 關於android開發 >> 非常直白的對move語義和右值引用的解釋

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

編輯:關於android開發

非常直白的對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 © Android教程網 All Rights Reserved