類的大小和其成員函式(非虛)沒有關係

2021-04-25 12:53:30 字數 1324 閱讀 9105

我們先來看看類的記憶體結構吧:  

class     a      

;      

int     read()      

public  

virtual   int   as()  

};      

對於以上的類的說明,當建立乙個例項時,其記憶體結構如下(不同的c++實現略有不同):  

+0000:   成員變數   int   a    

+0004:   $a$vtable指標     -->         +0000:   成員函式指標   as  

為什麼op函式和read函式不需要在類中體現呢?因為沒有必要。  

當c++編譯以上的類時,它會產生類似以下的成員函式(不同的c++實現略有不同):  

//op函式  

int   $a$op@i_(a*   this,   int   value)    

//read函式  

int   $a$read@_(a*   this)    

//as函式  

int   $a$as@_(a*   this)    

也就是說,函式名本身就指明了函式是屬於哪個類的(連引數型別都有),因此,編譯器在編譯**時,可以直接呼叫該類的成員函式,而不需要類本身提供任何資訊。  

例(0):  

a   a;  

對於函式呼叫:  

a.read();  

此時,a是a的例項,因此編譯生成**為:  

$a$read@_(&a);  

例(1):  

a   a;  

對於函式呼叫:  

a.as();  

此時,a是a的例項,因此編譯生成**為:  

$a$as@_(&a);  

例(2)  

a*   pa;  

對於函式呼叫:  

pa->read();  

對應生成**為:  

$a$read@_(pa);  

例(3)  

a*   pa;  

對於函式呼叫:  

pa->as();  

對應生成**為:  

(pa->$a$vtable[0])(pa);  

請注意:  

如果不是用指標呼叫,那麼是不是virtual函式,呼叫方法是一樣的,參見例(0)和例(1)  

如果是指標呼叫,例(2)和例(3)就是呼叫virtual函式和普通成員函式的區別。就因為有這區別,所以virtual函式必須在類中佔一席之地   

C 空類以及沒有成員變數的類的大小

關於c 中空類的大小為1,我們大家都有所了解,但是除了空類之外的其他一些沒有成員變數的類的大小,還是有很多不明之處的。include usingnamespacestd classa classb classc publica classd publicb,publicc intmain 程式執行的...

C 空類及沒有成員變數的類的大小例項分析

眾所周知的c 中空類的大小為1,但是除了空類之外的其他一些沒有成員變數的類的大小,還是有相當一部分開發人員對此有很多不明之處的。這裡我們以如下 為例 includ程式設計客棧e using namespace std class a class b class c 程式設計客棧 public a c...

類中宣告的函式和類的成員函式

define crt secure no warnings include using namespace std class a void a f1 void f int main 在類內宣告的函式未必是類的成員函式,也許只是宣告一下,告訴編譯器,我有這個函式。編譯器說,好,我知道了。但是實現f ...