繼續(xù)反匯編系列,本次使用vc2008在x86體系下分析c++中的引用。
定義一個(gè)引用類(lèi)型和將一個(gè)變量轉(zhuǎn)換成引用類(lèi)型一樣嗎?
引用比指針安全,真的是這樣嗎,對(duì)引用不理解的話比指針還危險(xiǎn)。
為什么要用常量引用傳參,只是為了只讀?
先來(lái)說(shuō)明一下下面使用到的詞匯:
對(duì)象:不是OO里的對(duì)象,而是泛指在c++語(yǔ)言中某種類(lèi)型(內(nèi)嵌,結(jié)構(gòu)體,類(lèi))的實(shí)例,與變量相同的意思。
存儲(chǔ)體: “the standard (draft 3225, section [basic.life]
) which clearly states that a reference binds to storage and can outlive the object which existed when the reference was created:”,對(duì)象(或變量)的存儲(chǔ)內(nèi)容的空間,一般是內(nèi)存。
下面用到的變量名命名規(guī)則:
引用: 以r開(kāi)頭,緊跟接類(lèi)型縮寫(xiě),如 float& rf。
指針: 以p開(kāi)頭,緊跟接類(lèi)型縮寫(xiě),如 float* pf, const float* pcf, float* const pfc。
c++代碼編譯成匯編代碼后,引用和指針同樣是一個(gè)指向內(nèi)存地址的存儲(chǔ)體(一般是內(nèi)存單元,或優(yōu)化后使用寄存器,存放指向的內(nèi)存地址)。
uintptr_t uintptr = 0;0041C7F6 mov dword ptr [uintptr],0 float flt = 0.f;0041C7FD fldz 0041C7FF fstp dword ptr [flt] float flt2 = 2.f;0041C802 fld dword ptr ds:[426C64h] 0041C808 fstp dword ptr [flt2] float& rf = (float&)uintptr;0041