簡述C 中虛函式的記憶體分配機制

2022-09-29 16:03:23 字數 919 閱讀 9383

因為虛函式的位址翻譯取決於物件的記憶體位址,而不取決於資料型別(編譯器對函式

呼叫的合法性檢查取決wnrnkti於資料型別)。原來,如果類中定義了虛函式,該類及其派生類

就要生成一張虛函式表,即vtable。而在類的物件位址空間中儲存乙個該虛函式表的入口,

佔4個位元組,這個入口位址是在構造物件是由編譯器寫入的。

有如下c++程式:

//#include

#includewww.cppcns.comeam>

using namespace std;

class cmem

public:

int m_first;

private:

unsigned char m_second;

public :

void fun1();

virtual int funover() };

class cmemsub : public cmem

public:

int m_three;

private:

int m_four;

public:

void fun3();

virtual int funover()

virtual int fun4()

};int main()

程式執行結果為:

這裡涉及到虛函式的工作機制,由於物件的記憶體空間中包含了虛函式表的入口,

編譯器能夠由這個入口找到適當的虛函式,這個函式的位址不再由資料型別決定了。

語句pmem = &b;使pmem指向物件b的記憶體空間,呼叫pmem->funover()時,

編譯器得到了物件b的vtable入口,並由這個入口找到了cmemsub::funover()虛函式位址。到此,虛函式的秘密終於大白於天下了。虛函式是c++語法的重點和難點。

C 記憶體分配機制

首先,來談談c 的5個儲存區 1.棧 是分配給函式區域性變數的儲存單元,函式結束後,該變數的儲存單元自動釋放,效率高,分配的空間有限。2.堆 由new建立,由delete釋放的動態記憶體單元。如果使用者不釋放該記憶體,程式結束時,系統會自動 3.自由儲存區 由malloc建立,由free釋放的動態記...

C C 中的記憶體分配機制

本文是總和了其它的幾篇帖子,主要是 一 字串 乙個字元乙個位元組,加上最後的乙個結束符 0 其中,strlen函式返回的字串長度不包括 0 sizeof操作符返回的位元組長度是包括 0 的。二 結構體的儲存 typedef struct sample sizeof sample 為1個位元組 typ...

C語言的記憶體的分配機制

指向字串常量的指標和字串陣列在使用時是有區別的。看下面兩個函式 執行通過,返回 hello world char ptrchar 執行錯誤,不能返回區域性變數 char arrchar 出現上面的原因在於指標pc指向的字串 hello world 存放在文字常量區,而陣列ac中存放的字串存放在棧區,...