類的大小與this指針

類是用戶自定義的類型,類可包含成員變量和成員函數,它們統稱爲類的成員,class是 C++ 中的關鍵字,專門用來定義類。下面我們看下代碼

這個代碼定義了一個叫Student的類,類中包含了學生姓名,性別,年齡和賦值函數,輸出函數,在主函數中還用sizeof輸出這個類的大小,下面我們來看看結果


可以看到類的大小其實只包含了類中成員變量的大小(20+4+4=28),那麼成員函數的大小爲什麼不計算在內呢?因爲在類中成員變量和成員函數是如下圖這樣存儲的,通過this指針指向成員函數找到函數的位置完成函數調用。


編譯器編譯類分爲3步:

1.識別類名。

2識別類數據成員。

3編譯函數並對函數進行重寫(實際就是增加this指針)


this指針的作用域是在類內部,當在類的非靜態成員函數中訪問類的非靜態成員的時候,編譯器會自動將對象本身的地址作爲一個隱含參數傳遞給函數。也就是說,即使你沒有寫上this指針,編譯器在編譯的時候也是加上this指針的,它作爲非靜態成員函數的隱含形參,對各成員的訪問均通過this指針進行。如上圖程序類中成員函數實際被改寫爲如下圖所示


this指針有如下特性:

1、this指針的類型 爲類類型* const。

2、this指針並不是對象本身的一部分,不影響sizeof的結果。

3、this的作用域在類成員函數的內部(不嚴謹)。

4、this指針是類成員函數的第一個默認隱含參數,編譯器自動維護傳遞,類編寫者不能顯式傳遞。


__thiscall調用約定:

a、__thiscall只能夠用在類的成員函數上。

b、參數從右向左壓棧。

c、如果參數個數確定,this指針通過ecx傳遞給被調用者;如果參數不確定,this指針在所有參數被壓棧後壓入堆棧。

d、對參數個數不定的,調用者清理堆棧,否則函數自己清理堆棧。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章