1:左值引用
引用其實(shí)還是指針,但回避了指針這個(gè)名字。由編譯器完成從地址中取值。以vs2019反匯編:
如圖,指針和引用的匯編代碼完全一樣。但引用在高級(jí)語(yǔ)言層面更友好,對(duì)人腦。比如可以少寫一個(gè) * 號(hào)和 -> 。
,以下是指針和引用的使用:
以上就是左值引用,引用的必須是具有內(nèi)存地址的對(duì)象,因?yàn)橐瓿梢贸跏蓟?br> 2 :
右值引用,引用的是值。一個(gè)變量的符號(hào)有兩層含義:出現(xiàn)在 = 左邊代表變量所在的內(nèi)存地址。如 a = 3
出現(xiàn)在等號(hào)右邊代表變量的值,即內(nèi)存地址里面存儲(chǔ)的值。
引入左值引用,右值引用,也是為了區(qū)分符號(hào)的這兩種屬性。左值引用的必須具有內(nèi)存地址,右值引用必須具有值,不能具有地址,比如常量。
如圖,c++ 對(duì)右值引用的處理是為這個(gè)只有值的常量分配內(nèi)存,在其中存儲(chǔ)常量的值,并把地址傳遞給右值引用。從高級(jí)語(yǔ)言的使用上與 a = 3 沒什么區(qū)別。而且可見,左右值引用,存儲(chǔ)的都是變量的地址,類似于指針。
3 :
但左值引用作為函數(shù)參數(shù),觸發(fā)copy構(gòu)造函數(shù)和賦值運(yùn)算符=函數(shù)。右值引用作為函數(shù)參數(shù),觸發(fā)移動(dòng)構(gòu)造函數(shù)和移動(dòng)運(yùn)算符=函數(shù),實(shí)現(xiàn)了不同的語(yǔ)義和功能。移動(dòng)比復(fù)制需要的指令更少,所以程序運(yùn)行更快。
4:
std:: move() 函數(shù),強(qiáng)制轉(zhuǎn)換左值引用為右值引用。c++ 的語(yǔ)法很有對(duì)稱性,定下了一個(gè)語(yǔ)法規(guī)則,再定義一個(gè)與本語(yǔ)法相斥的規(guī)則。功能很完善。
語(yǔ)法上 :
最終結(jié)果實(shí)現(xiàn)了 rLLa 和 rLa 同時(shí)對(duì) a 的引用,都指向 a 。修改rLa 為左值引用 int & rLa = a;以編譯調(diào)試則:
5 : 解釋 std :: move()
該函數(shù)的定義如下:其參數(shù)是右值引用,返回值還是右值引用,找重點(diǎn),靜態(tài)轉(zhuǎn)換的函數(shù)先少考慮,一會(huì)看匯編,看結(jié)果。
以下是對(duì) move 函數(shù)調(diào)用的匯編處理,x64的調(diào)試環(huán)境,現(xiàn)在用32位x86調(diào)試就落后了。
可見: move 函數(shù)要求傳入的是變量的地址。該函數(shù)其實(shí)直接把參數(shù)中接收的變量地址給返了回去。實(shí)現(xiàn)了強(qiáng)制左值為右值。即有內(nèi)存地址的仍然作為右值引用。
以下就是 move 編譯后的匯編代碼:文章來源:http://www.zghlxwxcb.cn/news/detail-443465.html
注意1397行,直接把參數(shù)的值返了回去。這是一個(gè)變量的地址。
所以結(jié)論是:左值引用,右值引用存儲(chǔ)的都是變量的地址,都是我們熟知的引用,沒有發(fā)生語(yǔ)義的變化。
謝謝閱讀。反匯編學(xué)編程,好辦法,文章來源地址http://www.zghlxwxcb.cn/news/detail-443465.html
到了這里,關(guān)于左值引用、右值引用,std::move() 的匯編解釋的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!