C 記憶體劃分與虛函式表在記憶體中的位置

2021-07-05 02:40:42 字數 1361 閱讀 8090

一直都不清楚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 類在繼承的時候,乙個子類的開始就是基...