一直都不清楚c++的記憶體具體是怎樣劃分的,只知道大致有堆區、棧區、全域性靜態區、常量區等劃分。如果沒記錯的話,好像還有乙個**區。
現在的問題是,c++裡的虛函式是借助虛函式表實現的,含有虛函式的類的物件中有乙個指向虛函式的指標(通常是物件前4個位元組(32位))。
那麼,虛函式表是儲存在記憶體中的哪個部分中呢?
在網上查了一些資料也沒搞明白,只好自己動手研究。
首先進行簡單的分析,虛函式表應該是在編譯期就已經決定了的,所以不可能在堆區與棧區。虛函式也不屬於**,所以推測在靜態區或常量區。
有乙個簡單的測試思路,寫乙個簡單的c++程式,把各個區段的位址和虛函式表位址都輸出出來,通過位址的位置來判斷。
擼出**如下:
#include
#include
using
namespace
std;
typedef
void (*fp)();
fp fp;
void fun()
class base
virtual ~base() {}
};class derived : base
virtual
void dio()
virtual ~derived() {}
};base b;
derived d;
int glob = 0;
int glob2 = 0;
const
int cons = 0;
int main()
執行後輸出結果:
sizeof(void*) 4推測出記憶體劃分為以下幾個部分:〇〇〇棧區:0x0029fee4
〇〇〇棧區:0x0029fee0
〇〇〇棧區:0x0029fe7c
〇〇函式區:0x00401334
〇〇常量區:0x0040e04e
〇〇常量區:0x0040e055
〇〇常量區:0x0040e0d0
〇虛函式表:0x0040fcd0
〇虛函式表:0x0040fce8
全域性靜態區:0x00411014
全域性靜態區:0x00411018
〇〇〇堆區:0x00830df0
〇〇〇堆區:0x00830e60
棧區函式區(函式區是**區嗎?)
常量區虛函式表(虛函式表屬於哪個區段?)
全域性靜態區堆區
因此,虛函式表介於常量區和全域性區之間。虛函式表似乎可以單獨作為乙個分割槽,或許記憶體劃分方式並不像想象中那麼嚴格。
以後查到資料再回來新增。
C 虛函式表在記憶體中的位置
by loren zhai 前段時間有人問c 虛函式表儲存在記憶體的什麼位置,下面是除錯的相關資訊。class ca class cb public ca class cd public cb void ca func virtual11 void ca func virtual22 void cb...
C 虛函式表與記憶體模型
1.虛函式 虛函式是c 實現多型的有力 宣告虛函式只需在函式前加上virtual關鍵字,虛函式的定義不用加virtual關鍵字。2.虛函式要點 1 靜態成員函式不能宣告為虛函式 可以這麼理解,虛函式是個動態的概念,在執行的時候才決定呼叫哪個,而靜態函式是個靜態的概念。更加細化的解釋是,靜態函式與物件...
C 虛函式在記憶體中的實現
首先來一張圖,一目了然 然後把相應的 貼上來 1 classa2 1011class b publica12 1920class c publicb21 後記 1 每個類的一開始都是乙個虛函式指標,這個指標指向乙個虛函式表,表中的每一項都是相應的虛函式的指標。2 類在繼承的時候,乙個子類的開始就是基...