剖析類的this指針

this指針是在實例化一個對象後產生的,並且指向對象本身.

類的this指針有如下特點:

(1) this只能在成員函數中使用.

      全局函數,靜態函數都不能使用this.

      實際上,成員函數默認第一個參數爲T* const  this

       如: class A{public: int func(int p){]};

      其中,func的原型在編譯器看來是: int func(A* const this, int p);

(2) this 在成員函數的開始前構造,在成員函數結束後清除.

(3) this指針會根據編譯器不同而有不同的放置位置.可能是棧,也可能是寄存器,甚至全局變量. 在彙編級別裏,一個值只會以3種形式出現:立即數,寄存器和內存變量值.

(4) this指針是如何傳遞給類中的函數的? this指針又是如何找到"類實例後函數"的?

      大多數編譯器通過ecx寄存器來傳遞this指針.

      在call之前,編譯器會把對應的對象地址放到eax 中.this是通過函數參數的首參數來傳遞的.this指針在調用之前生成,至於"類實例後函數"沒有這個說法.類在實例化時,只分配類中的變量空間,並沒有爲函數分配空間.自從類的函數定義完成後,它就在那兒,不會跑的.

(5) 在獲得一個對象後,能不能通過對象使用this指針?

     this指針只有在成員函數中才有定義.因此,你獲得一個對象後,也不能通過對象使用this指針.所以,我們無法知道一個對象的this指針的位置,當然,在成員函數裏,你是可以知道this指針的位置的(可以通過&this獲得),也可以直接使用它.

(6) 普通的類函數(無論是成員函數,還是靜態函數)都不會創建一個函數表來保存函數指針.

      只有虛函數纔會放到函數表中,即使是虛函數,如果編譯器能明確知道調用的是哪個函數,編譯器就不會通過函數表中的指針來間接調用,而是會直接調用該函數.

發佈了30 篇原創文章 · 獲贊 2 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章