1. 程式人生 > >C++ 類中成員函數分析

C++ 類中成員函數分析

分布 編碼規則 vptr 顯示 不能 模型 () 靜態 you

概述
之前對成員變量的分布進行了整理,今天就對成員函數進行整理。

1、非靜態成員函數
C++的設計準則之一就是:非靜態成員函數至少和一般的非成員函數的執行效率相同。

為了實現上衣準則,編譯器會對非靜態成員函數進行改進,先看下面的例子:

float func(const Point3d* _this) { .... }

float Point3d::func() const { .... }
1
2
3
編譯器對會Point3d::func()做下面三個步驟的操作:

1、改寫函數func以安插一個額外的參數到成員函數中,使得此類對象可以被使用,這個額外的參數被稱為this指針。如下:

Point3d::func( Point3d*www.mhylpt.com const this )
1
如果成員函數也是const,則為:

Point3d::func(www.meiwanyule.cn const Point3d* const this )
1
2、將每一個對 “非靜態成員的存取操作” 改為經由 this 指針來存取。

return sqrt( this->x * this->x + this->y * this->www.michenggw.com y + this->z * this->z )
1
3、將 成員函數 重新編寫成一個外部函數,此函數獨一無二。這個咱前面整理C++函數編碼規則時講過了,大概的意思是分為兩步:第一步是區分不同類中的同名函數,在函數後加類名信息。第二部是為了類中的重載函數,再在後面加參數信息。

2、靜態成員函數
靜態成員函數相當於只執行非靜態成員函數中的第三步。因為它不屬於單個對象,所以沒有this指針的概念。由於沒有this指針所以有以下特性:

不能夠直接存取其class中的非靜態成員
不能夠聲明為const、virtual、volatile
不是必須由類對象進行調用
3、虛函數
之前整理過C++ 虛函數原理,對於虛函數的調用可以分為三個過程:

編譯器產生虛函數表,定義類對象時,對象中產生vptr,指向虛函數表。
虛函數的調用,會從虛函數表中檢索出索引。
添加額外的參數,跟非靜態成員函數一樣,這個參數是this指針。
由於存在虛擬機制,所以顯示的調用虛函數是比較有效率的,但是這樣會喪失掉多態。

4、函數調用效率
對於靜態成員函數和非靜態成員函數,執行效率和非成員函數是一樣。

對於虛函數,因為增加了多態機制,需要動態檢索,所以效率會降低。

感謝大家,我是假裝很努力的YoungYangD(小羊)

參考資料:
《深度探索 C++對象模型》
---------------------

C++ 類中成員函數分析