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

2021-05-25 06:20:13 字數 2265 閱讀 3146

by loren zhai

前段時間有人問c++虛函式表儲存在記憶體的什麼位置,下面是除錯的相關資訊。

class ca

;class cb : public ca

;class cd : public cb

;void ca::func_virtual11()

void ca::func_virtual22()

void cb::func_virtual11()

void cb::func_virtual33()

void cd::func_virtual11()

void cd::func_virtual22()

void cd::func_virtual33()

void demo()

72 004010c2 8b07 mov eax,dword ptr [edi]

72 004010c4 8bcf mov ecx,edi

72 004010c6 ff10 call dword ptr [eax]

73 004010c8 8b17 mov edx,dword ptr [edi]

73 004010ca 8bcf mov ecx,edi

73 004010cc ff5204 call dword ptr [edx+4]

75 004010cf 8b06 mov eax,dword ptr [esi]

75 004010d1 8bce mov ecx,esi

75 004010d3 ff10 call dword ptr [eax]

76 004010d5 8b16 mov edx,dword ptr [esi]

76 004010d7 8bce mov ecx,esi

76 004010d9 ff5204 call dword ptr [edx+4]

0:000> ln poi(250e80)

(004070e8) cvirtualclassdemo!cb::`vftable'

0:000> ln poi(250e98)

(004070dc) cvirtualclassdemo!cd::`vftable'

0:000> dds004070dc-0x10

004070cc 00000002

004070d0 0000004d

004070d4 00000000

004070d8 0000b000

004070dc

00401040 cvirtualclassdemo!cd::func_virtual11 

004070e0 00401050 cvirtualclassdemo!cd::func_virtual22 

004070e4 00401060 cvirtualclassdemo!cd::func_virtual33 

004070e800401020 cvirtualclassdemo!cb::func_virtual11 

004070ec 00401010 cvirtualclassdemo!ca::func_virtual22 

004070f0 00401030 cvirtualclassdemo!cb::func_virtual33 

004070f4 00000000

004070f8 ffffffff

004070fc 0040126d cvirtualclassdemo!maincrtstartup+0xc0

0:000> !address 004070dc  

usage: image

allocation base: 00400000

base address: 00407000

end address: 00408000

region size: 00001000

type: 01000000 mem_image

state: 00001000 mem_commit

protect: 00000002 page_readonly

1. 虛函式表儲存在唯讀記憶體段中。

2. 具體的虛表內容,在編譯時就決定了整個繼承鏈上v-table的資訊。中間的某個子類,它的v-tabel是整個v-table的乙個子結構。因為包含虛函式的類的資料結構,第乙個dword儲存了v-table的位址,同時這個值是在建立類時確定了。通過上面demo函式的反彙編,就能清楚是如何找到當前虛函式的具體的實現實現函式了。

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

一直都不清楚c 的記憶體具體是怎樣劃分的,只知道大致有堆區 棧區 全域性靜態區 常量區等劃分。如果沒記錯的話,好像還有乙個 區。現在的問題是,c 裡的虛函式是借助虛函式表實現的,含有虛函式的類的物件中有乙個指向虛函式的指標 通常是物件前4個位元組 32位 那麼,虛函式表是儲存在記憶體中的哪個部分中呢...

虛函式表的位置

引言 近日 csdn的 c c 語言 版的乙個問題 引 起了我的注意 請問虛函式表放在 我也曾經思考過這個問題,零零散散也有一定的收穫,這次正好趁這個機會把我對這一部分的理解整理一下。首先值得宣告的是,本文的編譯環境是vs2002 winxp。c 標準並沒有對虛函式的實現作出任何的說明,甚至都沒有提...

C 虛函式在記憶體中的實現

首先來一張圖,一目了然 然後把相應的 貼上來 1 classa2 1011class b publica12 1920class c publicb21 後記 1 每個類的一開始都是乙個虛函式指標,這個指標指向乙個虛函式表,表中的每一項都是相應的虛函式的指標。2 類在繼承的時候,乙個子類的開始就是基...