C++ 類中成員函式分析
概述
之前對成員變數的分佈進行了整理,今天就對成員函式進行整理。
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++物件模型》
---------------------